Birden çok oturum çalıştırırken garip bash geçmişi davranışı


15

Birden çok terminal penceresi kullandığımda komut satırı geçmişi nasıl saklanır? Saklandığını biliyorum .bash_historyama yeni bir pencere açarsam hangi tarihin kullanıldığına dair mantığı göremiyorum. Yeni pencerede yukarı ok kullanmaya çalışırsam hangi komutu göreceğimi asla bilmediğim için neredeyse belirsiz hissettiriyor.

Birisi bunu açıklayabilir mi?

Geçmişi belirli bir pencereden geçmişi yeniden kullanabileceğim şekilde kontrol etmenin bir yolu var mı?

Yanıtlar:


14

Bash tarihinin davranışını anlamak için önce aşağıdakileri bilmeniz gerekir:

  1. Geçmiş dosyasında geçmiş var.
  2. Bir bash sürecinin hafızasında tarih vardır.
  3. Bir bash işleminin belleğindeki geçmiş, başka bir bash işleminin belleğindeki geçmişle senkronize edilmez.
  4. Bir bash işleminin belleğindeki geçmiş, açıkça sorulmadıkça veya belirli bir olay sırasında (geçmişe bakın), dosyadaki geçmişle senkronize edilmez.

Varsayılan ayarları kullanarak, bir bash oturumunun geçmişe ilişkin yaşam döngüsü aşağıdaki gibidir:

  1. Başlangıç ​​sırasında bash geçmiş dosyasını okuyacaktır. Geçmiş dosyasının içeriği şimdi bash işleminin belleğindedir.
  2. Normal kullanım sırasında sadece bellekteki geçmiş manipüle edilir.
  3. Kapatma sırasında bellekteki geçmiş, geçmiş dosyasının önceki içeriğinin üzerine yazarak geçmiş dosyasına yazılır.

Gözlemlediğiniz görünüşte belirsiz davranış, çoğunlukla geçmiş dosyasının içeriğinin her zaman son kapalı bash oturumunun geçmişi olması ve bash yalnızca başlatma sırasında geçmiş dosyasını okumasıdır.

Başlatma ve kapatma işleminin daha ayrıntılı bir açıklaması için bash kılavuzunu okuyun .

Varsayılan ayarlarda bash varsayılan ayarlarının kastedildiğini unutmayın. Dağıtımınız bu davranışı değiştiren bir .bashrc(veya /etc/bash.bashrc) sağlamış olabilir .

Kabuk seçeneğini etkinleştirerek histappendgeçmiş dosyasının üzerine yazmak yerine bash'ın eklenmesini söyleyebilirsiniz. histappendKomutu kullanarak etkinleştirebilirsiniz shopt -s histappend. Bu seçeneğin her zaman etkin olması için, komutu .bashrc(veya başka bir başlatma dosyasına) koymanız gerekir . Bash kılavuzundakishopt komut hakkında daha fazla bilgi edinin

Etkinleştirmenin histappend, görünüşte belirsiz olan davranışı çok fazla azaltmayacağını unutmayın . Çünkü her bash oturumunun hala kendi geçmişi vardır. Çoğunlukla senkronize bir bash geçmişine sahip olmak mümkündür. Her bash işleminin yığın taşması üzerindeki bir iş parçacığında çoğunlukla senkronize edilmiş bir geçmişe sahip olması için bir kılavuz vardır .

yerleşik komutunu kullanarak bash'a historygeçmişi dosyadan belleğe okumasını veya bellekten dosyaya yazmasını açıkça söyleyebilirsiniz. Örneğin: history -rdosyanın içeriğini okur ve bellekteki geçmişe ekler. history -wönceki içeriğin üzerine yazarak mevcut geçmişi bellekten dosyaya yazacaktır. Temelde kapatma sırasında olan şey budur. Bash kılavuzundakihistory komut hakkında daha fazla bilgi edinin

Tamlık için, geçmiş davranışını değiştiren iç değişkenlerin listesi:

  • HISTFILE: okunacak ve tarih yazılacak dosya.
  • HISTFILESIZE: geçmiş dosyası için maksimum satır sayısı.
  • HISTSIZE: bellekteki geçmiş için maksimum satır sayısı.
  • HISTCONTROL, HISTIGNORE, HISTTIMEFORMAT: Bu tartışma alakalı değildir. Ayrıntılar için bash kılavuzunu okuyun .

İyi açıklama. Kapatmadan bahsettiniz, ama terminal oturumunu öldürmeye ne dersiniz? Oturum, oturum kapatma veya kullanıcı arabirimi aracılığıyla veya ağ bağlantısındaki düşüş gibi başka yollarla öldürülebilir. Tüm geçmiş dosyası değiştirilirse ve birden çok oturumunuz varsa, son kapatılan geçmişin geçmişinin geçmiş dosyasında kullanılacağını mı söylüyorsunuz? Bu deterministik olmayan davranışı açıklayabilir.
Alex Gitelman

yaşam döngüsü noktası (3) doğru değil. Geçmiş dosyasına yalnızca ilk bash oturumu yazacak gibi görünüyor. Test: 2 seansı sırayla açın, b. İçinde 'merhaba yankı' Do b . Ardından b . Sonra yeni bir oturum açın c . Bu oturumun tarihinde yankı merhaba olmayacak.
user606723

@AlexGitelman: bir bash işlemi öldürülürse, geçmiş dosyasının üzerine yazma şansı olmaz. ve evet, son kapatılan oturumun geçmişi geçmiş dosyasında yer alacaktır.
lesmana

@ user606723: nokta 3 doğru. bash kılavuzunu okuyun. minimal bir .bashrcdosya kullanarak tekrar deneyin . dağıtımınızın içindeki bazı ayarları değiştirmiş olabileceğini unutmayın /etc/bash.bashrc. kabuk seçeneği için özel olarak kontrol edin histappend.
lesmana


0

AFAIK, bash komutları SSH oturumu sonlandırıldıktan sonra kaydedilir. Bu nedenle, bir oturum anormal olarak sona erdiğinde komutlar kaydedilmez (örneğin, ağ hatası nedeniyle). Burada SSH oturumları hakkında konuşuyorum. Yerel terminaller benzer yaklaşımı kullanabilir.

Aynı anda birden çok oturum açarken, bir oturumda yazılan komutlar diğer ikisi de etkinken diğer oturumda görülmez. Ancak, oturumunuzu sonlandırdığınızda bu komutları yeniden açacaksınız.


Bu benim yaşadığım davranış değil. Bir ssh oturumu açtığım, bir komut yaptığım ve zarif bir çıkış yaptığım hızlı bir test yaparak bunu doğrulayabilirim. Bu durumda, daha önce aktif başka bir ssh oturumu vardı. Önceden var olan bu bash oturumunda .bash_history'yi kontrol ediyorum ve kaydedilen hiçbir şey bulamıyorum. İlk bash oturumunun .bash_history'ye kayıt yapan tek oturum olduğunu düşünüyorum.
user606723

Oturumunuzu sonlandırmak şu anda çalışan oturumları etkilemez, ancak yeni oturumları etkiler!
Khaled

Kullanıcı arabirimi aracılığıyla kapattığım SSH değil Gnome terminal penceresi değilse ne olur?
Alex Gitelman

Doğrulanması gerekiyor. Şu anda bir Gnome terminaline erişimim yok!
Khaled

@Khaled, Test edilmiş, yeni oturumları etkilemez. (Yine de .bash_history'yi kontrol ettim, bu da bash'ın yeni oturumlar için komut geçmişini aldığı yerdir, işe yaramayacağını biliyordum; ama yine de seni mizah ettim.)
user606723 2:11
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.