Bash'ın tarihi nerede saklanıyor?


95

Eğer koşarsam history, en son yürütülen komutlarımı görebiliyorum.

Ama yaparsam tail -f $HISTFILEveya tail -f ~/.bash_historylistelenmezler.

Dosya kilitlenir mi, geçici bir yer veya benzeri bir şey var mı?

Yanıtlar:


117

Bash, komutların listesini çalışırken dahili olarak bellekte tutar. .bash_historyÇıkışta yazılır :

Etkileşimli bir kabuk çıktığında, son $ HISTSIZE satırları geçmiş listesinden $ HISTFILE adlı dosyaya kopyalanır.

Komut geçmişini yazmaya zorlamak istiyorsanız, aşağıdaki komutu kullanabilirsiniz history -a:

Yeni geçmiş satırlarını (geçerli Bash oturumunun başlangıcından beri girilen tarih satırları) geçmiş dosyasına ekleyin.

Bir -wseçenek de var:

Geçerli geçmişi tarihçeye yaz.

tarihinizi tam olarak nasıl kullandığınıza bağlı olarak size daha uygun olabilir.

Her zaman derhal yazıldığından emin olmak istiyorsanız, bu komutu PROMPT_COMMANDdeğişkeninize ekleyebilirsiniz :

export PROMPT_COMMAND='history -a'

Yan not: .bash_historyDosyanız yanlışlıkla kökündeyse, işler durur. Bu durumda, mülkiyeti kontrol edin ve sudogerekirse mülkiyeti düzeltmek için kullanın .
torek

13

(Cevap değil ama yorum ekleyemiyorum)

Yalnızca .bash_historybelirli bir komutu silmek istediğinizden (örneğin, açık bir şifre içeren) kontrol ediyorsanız, bellekteki girişi doğrudan silebilirsiniz history -d <entry_id>.

Örneğin, şöyle bir çıktı varsayalım:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

ve exportçizgiyi temizlemek istiyorsan , bunu basitçe başarabilirsin:

history -d 928

11

bash çalışma hafızasında tutulur, bash kapandığında veya her komuttan sonra kaydetmek ve bash başladığında veya istek üzerine yüklenmek üzere bash yapılandırılabilir.

Her komuttan sonra kaydetmeyi yapılandırırsanız, aynı anda birden fazla bash çalıştırmanın etkilerini göz önünde bulundurun. (komut satırları serpiştirilecek)


2
Yanıtınızın başlangıcı, geçmişin bash adlı bir dosyada, hatta bashexetable'da saklanmış gibi görünmesini sağlar. "Bu, bellekte saklanır bash..."
yazardım

bu gerçekten daha iyi
Anthon

5

Oturumunuz aktifken komutlar belleğe (RAM) kaydedilir. Kabuğu kapattığınız anda komutlar listesi .bash_historykapanmadan önce yazılır .

Böylece şu anki oturumun geçmişini göremezsiniz .bash_history.


4
Geçmiş dosyası, bashyeniden başlatmayı gerektirmeyen sonlandırma üzerine güncellenir (özellikle terminalleri istediğiniz gibi açıp kapatabileceğiniz grafiksel ortamlarda).
John WH Smith

4

Çalışırken, aşağıdaki durumlarda tarihçeyi yalnızca bellekte (varsayılan olarak) tutar:

  • set -o geçmişi (bir Hgiriş echo "$-") ayarlanır.
  • TARİHÇE değildir 0 ve
  • TARİHÇE değil *(veya başka bir çok kısıtlayıcı desen).

Yukarıdakilerden herhangi biri başarısız olursa, hiçbir tarih bellekte saklanmaz ve sonuç olarak diske tarih yazılmaz veya yazılmaz.

Aşağıdaki durumlarda bellekteki tarih diske yazılır:

  • HISTFILESIZE 0 değil ve
  • HISTFILE ayarlanmamış.

Ancak yalnızca kabuk çıktığında veya komutları history -a(ekleme) veya history -w(yazma) çalıştırıldığında.

Diske hemen bir yazma tetiklemek için değişkeni kullanabilirsiniz:

 PROMPT_COMMAND='history -a'

hangi edecek geçmiş dosyasına tarih hatları. Bunlar, geçerli bash oturumunun başlangıcından beri girilen ancak geçmiş dosyaya henüz eklenmemiş olan tarih çizgileridir.appendnew

Veya:

 PROMPT_COMMAND='history -w'

To üzerine bellekten listesiyle HISTFILE tarih.

Böylece, hafızada bulunan bir komutu kaldırabilirsiniz:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

Ve son komutla diske yaz:

 history -w    # with `shopt -u histappend` unset

Bunu bir cron işine sokarak yanlış bir şey olur mu? Ben çok daha az sayıda kullanıcı adlarıyla çok sayıda kullanıcı belirli bir sunucuya oturum açan ve halen geçmiş oldukça küçüktür ve bu ... eski sunucu, ama belki bazı oturum kapatıldı asla şüphe
oneindelijk
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.