Birden fazla Konsole'den bash geçmişini kaydetme doğru çalışmıyor


9

Birden fazla Konsole terminali kullanıyorum. Ve her terminalde yazdığım tüm komutların komut geçmişine kaydedilmesini istiyorum, böylece açacağım bir sonraki konsole hepsine sahip olacak. Her terminalin diğer terminalin komut geçmişini yazmasını önlemek için,.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

Komut numarasını istemimde görmek için son satırı verdim. Komut no. hiçbir zaman 600'ün üzerine çıkmadı, ama yine de eski komutlarımın bir kısmı tarihe karışıyor. Tekrar tekrar verilen birçok komut vardır, ancak beklendiği gibi ignoredupskomut istemini hiçbir zaman artırmaz. Yine de eski komutlar hala kayboluyor ve tarihteki komutların sayısı her zaman 500'den biraz daha fazla.

.bash_historyDosya hala ignoredups rağmen çiftleri bir şey içeriyor.

PS: yankı çıkışı $HISTSIZEve $HISTFILESIZEher ikisi=1000


Güncelleme: Sorunu yukarıdaki girişte buldum .bashrc. Sadece çağırarak history -aiçinde PROMPT_COMMANDbasitçe .bash_history son yeni komutu ekler. Yani ignoredupsve erasedupshiçbir etkisi yoktur.

Herhangi bir yolu var mı, hala her terminalden kopyaları olmadan .bash_history yazabilirsiniz? Tüm komut isteminde geçmişin tamamını yüklemek istemiyorum history -rve tekrar yazıyorum history -w, çünkü bir terminalde verdiğim komutlar başka bir paralel çalışan terminalde de görünecek. Kombine komutların sadece yeni bir terminalde görünmesini istiyorum.

Tarihimin neden 500'e kırpıldığı bulmacası çözüldü. Bu makineye her seferinde bunun olduğunu fark ettim. .bash_profileAşağıdaki girdiyle bir oluşturmak bu sorunu çözdü.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Şimdi .bashrc dosyam her ssh yaptığımda yürütülür. Ve geçmiş dosya boyutu artık monoton olarak artıyor.



Hayır. Oli listesindeki ikinci şarttan kaçınmak istiyorum. Farklı terminalimin tarihinin karışmasını istemiyorum. Yeni bir terminal başlayana kadar. Makinemi düzgün bir şekilde kapattığımda bu doğal olarak gerçekleşir. Ancak bazen uygun kapatma mümkün değildir ve geçmişi anında kaydetmezsem, ani bir güç kesintisi ile hepsi kaybolur.
indiajoe

bug-bashBu soru gönderildikten bir yıl sonra posta listesinde çıkan soruya çok benziyor : lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
sözdizimi

Yanıtlar:


1

Yeni komutları doğrudan ve aynı zamanda yinelenenleri kaldırmanın mümkün olmadığı sonucuna vardım. Benim çözümüm, aşağıdaki komutları bir süre çalıştırmak. veya crontab'ımın içine koymam.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

Yukarıdaki komut, bir komutun son tekrarlamasını korur ve üstündeki diğer tüm tekrarları, siparişi bozmadan geçmiş dosyasından kaldırır.


0

Bu çirkin ve eminim sedya awkda daha iyi olurdu, ama ben bunu ekleyerek aynı sorunu düzeltmek için çalıştı .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Bu, açtığınız her terminal için ayrı bir geçmiş dosyası oluşturur, ancak bash içinde bash çalıştırırsanız, aynı geçmişi kullanır, ancak üzerine yazılmamalıdır. Deneyimlerimden bir uyarı ile sizi uyaracağım. Bu işe yarar ve tarihin üzerine yazılmasını engellerken, aradığınız grepgeçmişi bulmaya çalışmak için birden fazla dosyaya ihtiyacınız vardır, bu da bazen zaman alıcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.