.Bash_history'ye hemen yazı yazmak mümkün müdür?


124

Sık sık açık sürü ve Terminaller sürü [Şu anda var 7 Bu çalışma açık] ve sık sık arama historyile grepben sadece son zamanlarda yazdım bir komut bulmak için, ama terminali avlamak istemiyorum ve daha sonra yukarı kaydırma ve daha fazlası için avlayın, vb .. Bazen terminaller 'çıkış' olmadan kapanıyor ve yazdığım her şey kayboluyor [Bazen öldürülen bir terminalde yazdığım bir şeye ihtiyacım vardı].

Her terminalin derhal .bash_history'ye yazmasını sağlayacak bir yol var mı? ya da en az dakikada bir kere, ya da bunun gibi bir şey?


2
Normalde control-rbir bash komut geçmişinde geriye doğru arama yapmak için kullanırım . history | grepBir regex gerekmedikçe daha uygun .
Peter Cordes

Yanıtlar:


92

Gerçek Zamanlı Güncelleme Tarihi Geçmişinde detaylandırıldığı gibi basit bir çözüm .

Bu komutları .bashrc config içine koyuyor diyor:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

İlk komut .history, eklenecek dosya modunu değiştirir. Ve ikincisi history -a, her kabuk isteminde çalıştırılacak komutu yapılandırır . -aHemen geçmiş dosyasına akım / yeni hatlar yazar.

İlgili: zsh:


1
iyi bu tür eserler. Biraz daha test etmeyi denedim ve yalnızca ilk komutta işe yaradığı görünüyor. sizin için doğru çalışıyor mu?
Matt,

54

Bunu içine koymayı dene .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Krediye buradan: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cçalışan oturumun geçmişini temizler. Bu tarih sayacını azaltacaktır $HISTSIZE. history -riçeriğini oku $HISTFILEve bunları geçerli çalışan oturum geçmişine ekle. Bu, tarih sayacını içerdiği satır miktarıyla artıracaktır $HISTFILE.

Bence bu komutların neredeyse hemen kullanılabilir olduğu anlamına geliyor (bir terminal, yazma echo 1, ikinci terminal echo 2, ilk echo 3ve aşağı oka iki kez basılması durumunda, echo 2mevcut olması gerekir. yazıldı.


Parlak! Teşekkürler. Acaba bu seçenekler neden belgelenmiyor man history...
artfulrobot

10
@artfulrobot: Bu komut bashyerleşiktir, bu yüzden içinde açıklanmıştır man bash. Ayrıca kullanabilirsiniz help history.
pabouk

2
Zsh'imin bu şekilde çalışacak şekilde yapılandırılmasını sağladım: Her kabuk kendi KEND'in geçmişini izler (ve ondan önce birleştirilmiş geçmiş) ve her komut birleştirilmiş geçmişe eklenir. Bu, her kabuk için her komut için her zaman yeniden yükleme geçmişinden farklı ve daha iyidir, çünkü her kabuk terminali için farklı bir "iş parçacığı" veya "iş" olma eğilimindeyim. Ben buna bu arasındaki fark olduğunu düşünüyorum -rve -csadece sahip vs -a.
Steven Lu,

Peki tam olarak ne kullanıyorsun? history -c; history -r? Sanırım senin için daha iyi, sadece benim için daha iyi olurdu, bazen bir işi yapmak için genellikle birkaç mermi kullanırım, böylece tarihi mümkün olduğunca birleştirmeyi tercih ederim. Aslında bu komutun ancak bittikten sonra tarihe yazıldığını düşünüyorum. Genellikle, bir ssh oturumu bir ana bilgisayara başlattığımda ve ilk hala çalışıyorken başka bir tane açmak istediğimde, onu yeniden yazmak zorundayım çünkü henüz tarihe yazılmadı.
sup

Ben yeterince uzun eşzamanlı bash yapmak (kabuk örneği bazında) tarihin paralel konuları takip etmek için nasıl anlamaya etrafında sıkışmış asla düşünmek ise hemen ana geçmiş dosyasına tarih yazıyor. Zsh bunu yapmayı çok kolaylaştırıyor, ayrıca ek olarak, geliştirdiğim tarihin geliştirilmiş dosyasına çok fazla süslü meta veri yazmak için bir zsh işlevi tanımladım . Oldukça vazgeçilmez hale geldi. Neyse, oradaki mekanizma zsh almak için precmd () ve preexec (), girilen komutu açıklayan args. Daha sonra bunu dosyalara yönlendirmek önemsiz hale gelir. history -ayeterli olabilir
Steven Lu

38

Yaklaşık 100000 girişli büyük bir geçmiş dosyam var ve geçmiş listesini temizleyen ve tüm geçmiş dosyasını okuyan ( history -cve ve kullanarak history -r) bilgi istemi görüntülenmeden önce gözle görülür (belki de 0.2 saniye) gecikme sağlayan değişkenler. Kullanımı history -nyalnızca yeni çizgiler geçmiş dosyasından okunan böylece daha hızlıdır:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND bir kabuk değişkeni olduğu için dışa aktarılması gerekmez.


Parlak! Bağlantı koptuğunda artık kayıp geçmiş yok!
Tobia,

Bu harika. Dosyaya ekleyip dosyadan okuyarak, geçmişi birden fazla terminalde paylaşır.
WISBucky

3

Diğer tüm cevaplar için bir not (temel olarak aynı şey):

Ayar PROMPT_COMMAND="history -a;$PROMPT_COMMAND"içinde .bashrc(veya arkadaş) yeterlidir.

Ayrıca, history -ageçerli oturumdaki geçmişi "enstantane" yapmak istediğinizde manuel olarak çalıştırabilirsiniz .

Komut shopt -s histappendgerekli değildir, çünkü history -adosyaya her zaman yeni satırlar ekler ve hiçbir zaman üzerine yazmaz. Ayrıca, en azından Bash 4'ten histappenditibaren varsayılan davranıştır.


10.03.6 Mac'imde o olmadan işe yaramadı gibiydi shopt -s histappend. Ayrıca şunu ekledim ki~/.bash_profile
ubershmekel

Muhtemelen, sisteminizde bir yerde devre dışı bırakılmış başka bir ayar vardır histappend, varsayılan ayar budur. Bunu arardım, ama bir Mac erişimim yok.
Guss
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.