Çoklu terminallerle Bash tarihçesinin işlenmesi


110

Ben ağırlıklı olarak Terminator kullanıyorum ve genellikle 3 split terminal penceresiyle açılıyor. Ayrıca çeşitli nedenlerden dolayı Gnome terminalini kullanıyorum.
Bu durumda bash tarihinin nasıl işlendiğini merak ediyorum, çünkü koşarken daha önce verilen komutları özlüyorumhistory

Örneğin, benim istemim mevcut bash geçmiş satırını ( \!) gösteriyor ve Terminator'ü 3 bölmeli pencere ile başlattığımda, tüm terminallerde aynı tarih çizgisini (100 diyelim) alıyorum. Hangi tarih kaydedilecek?

Ayrıca Terminator'ü kullandıktan sonra Gnome Terminali'ni başlatıyorum. Terminator'de daha önce verilen tüm komutlar ne olursa olsun başlangıçta satır 100'ü alıyorum.


Yanıtlar:


107

Kaydedilen bash oturumu en son kapatılan terminal için olandır. Her oturum için komutları kaydetmek istiyorsanız, burada açıklanan numarayı kullanabilirsiniz .

export PROMPT_COMMAND='history -a'

Manpage'den alıntı yapmak için: “Eğer ayarlanmışsa, değer her bir birincil bilgi istemi yayınlanmadan önce bir komut olarak yürütülür.”

Bu yüzden komutum her bittiğinde, komut ~/.bash_historyistemini (sadece $ PS1) tekrar göstermeden önce yazılı olmayan tarih öğesini ekler .

Bu yüzden bu çizgiyi koyduktan sonra /etc/bash.bashrckendimi yeniden icat eden tekerlekler bulmak zorunda kalmam veya sadece terminallerim ile tembel olduğum için bir şeyler yazarken değerli saniyeleri kaybetmem gerekmiyor.

Her neyse, farklı oturumlardan gelen komutların geçmiş dosyanızda karıştığını dikkate almanız gerekir, böylece daha sonra okumak çok kolay olmayacaktır.

Ayrıca bakınız:


farklı TTL için ayrı olarak depolanmıyor mu?
Vineet Menon

Mükemmel. Açıklama ve çözüm için teşekkürler. Denedim export PROMPT_COMMAND='history -a; history -r've terminalde bazı tuhaf geçmiş satır numaralarını aldım - bazı komut geçmişi satır numaralarını 2000 yerine 1 ile atladıktan sonra, garip ancak belirtildiği gibi davrandı - tüm terminallerin geçmişi kaydedildi.
zetah

@VineetMenon Daha fazla ayrıntı için buraya bakın . İlginç kısımlar: Kabuk başladığında, tarih HISTFILE değişkeni tarafından adlandırılan dosyadan başlatılır (varsayılan `~ / .bash_history '). [...] Etkileşimli bir kabuk çıktığında, son $ HISTSIZE satırları geçmiş listesinden $ HISTFILE adlı bir dosyaya kopyalanır.
jcollado



32

Birden fazla okumadan sonra man bash, her kabuk için ayrı tarih dosyaları kullanıyorum. Yaptığım bir mkdir -m 0700 ~/.historyilave

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

benim için ~/.bashrc. Her şimdi ve sonra, onu hatırladığımı du -sk .historyve temizlediğimi hatırlıyorum . Yazdığım her komutu benim için saklaman çok güzel.

Ben sadece, geç kaldığımı görmek için yukarıdakileri kullandım:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
ya da
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(örneğin sudo mountsıralama zincirine 1. argümanı dahil etmek için).


3
Neden HISTFILESIZEiki kere atarsın?
Daniel,

2
HISTFILESIZE değerini 0'a ayarlayarak, tarih arabelleğini temizler ve geçmiş kaydetme mekanizmasını sıfırlarım. Ardından, gerçekten istediğim boyutu belirledim ve HISTFILE’da geçmişi kaydetmeye başladım. TARİHİ bölümüne bakın man bash.
waltinator

1
Ctrl+ryeniden iş yapmak için geçmiş dosyalarını birleştirmek için bir yolu var mı?
n611x007

3
Bu yeni bir soru olmalı, ama bunun iyi bir fikir olduğunu sanmıyorum. Bunun yerine egrep 'whatever' .history/*(veya cat .history/* | egrep 'whatever') kullanıyorum ve ayrı bir oturumun geçmişini aramak için Ctrl-r'yi kullanıyorum. Oku man bash-builtinstarih komutu hakkında. Benim sort .history/* | uniq -c | sort -n | wc -lgösterileri 16033 benzersiz komutlar, cut '-d ' -f1 .history/* | sort | uniq -c | sort -n2004 benzersiz komutları, çoğunlukla Yazım hatalarından gösterir. Bunların hepsini bash’ın “tarihçe listesine” yüklemek yardımcı olmaz.
vals

@waltinator - Bunun eski bir yorum olduğunu biliyorum, ancak bir ortam değişkeni ayarlamanın bir şekilde hemen bir eylemi tetiklediğini mi ima ediyorsunuz? yerel bir kabuğa HISTFILESIZE için 0 değeri verdikten sonra hemen 4096 olarak değiştirdiğiniz gerçeğini ne tür bir süreç ele alacak? Bu, belli değişken isimlerinin bash kullanımıyla ilgili belgelenmemiş bir şey midir?
senkronize edilmemiş

8

historyTüm terminallerden göstermek için:

Ekle export PROMPT_COMMAND='history -a; history -r'.bashrc dosyasına.

Kaynak: http://northernmost.org/blog/flush-bash_history-after-each-command



3
Bunu kullandıktan birkaç ay sonra nihayetinde bunu son zamanlarda yorumladığımı söyleyeceğim. Sadece Tmux bölmesinde çalıştırdığım birini çalıştırmak için her zaman son 100 komutun içinde elemek istemediğim için acı tatlı
Elijah Lynn

Balık kabuğunun sunduğu güzel bir çözümdür history --merge. Bunu bir yıldan beri kullanıyorum ve bu sorunu çözüyor. En son tarihin diğer oturumlardan gelmesini istediğimde, sadece bu komutu çalıştırıyorum ve bu anında bana açık.
Elijah Lynn

ihracat gerekli değildir.
Sınırlı Kefaret

6

Ayrıca "Bkz bash kalıcı geçmişi tutarak başka bir alternatif". Herhangi bir terminale yazdığınız tüm komutları "kalıcı bir tarih" dosyasına (genellikle normalde yapılanların yanı sıra) göndermek istemeniz istenir .history.


1
Ben takılı $$ çizgi yapmak için echo $$ $date_part "$command_part" >> ~/.persistent_historybiz birden geçmişlerini soyutlanarak, böylece bu onların bash sürecinin edilen PID girdilerini önek.
Evgeni Sergeev

CTRL-R geçmiş araştırmasıyla çalışmak için alternatif geçmiş yapılabilir mi?
en fazla
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.