Di mana riwayat bash disimpan?

95

Jika saya menjalankan history, saya dapat melihat perintah terbaru saya yang dijalankan.

Tetapi jika saya lakukan tail -f $HISTFILEatau tail -f ~/.bash_history, mereka tidak masuk daftar.

Apakah file terkunci, apakah ada lokasi sementara atau yang serupa?

Adionditsak
sumber

Jawaban:

117

Bash menyimpan daftar perintah secara internal di memori saat sedang berjalan. Mereka ditulis .bash_historypada saat keluar :

Ketika shell interaktif keluar, $ HISTSIZE baris terakhir disalin dari daftar riwayat ke file bernama $ HISTFILE

Jika Anda ingin memaksa sejarah perintah untuk ditulis, Anda dapat menggunakan history -aperintah, yang akan:

Tambahkan baris histori baru (baris histori dimasukkan sejak awal sesi Bash saat ini) ke file histori.

Ada juga -wopsi:

Tuliskan riwayat saat ini ke file riwayat.

yang mungkin lebih cocok untuk Anda, tergantung pada bagaimana tepatnya Anda menggunakan riwayat Anda.

Jika Anda ingin memastikan bahwa mereka selalu ditulis segera, Anda dapat memasukkan perintah itu ke PROMPT_COMMANDvariabel Anda :

export PROMPT_COMMAND='history -a'
Michael Homer
sumber
Catatan: jika .bash_historyfile Anda secara tidak sengaja menjadi milik root, semuanya berhenti berfungsi. Dalam hal ini, periksa kepemilikan dan gunakan sudountuk memperbaiki kepemilikan jika diperlukan.
torek
13

(Bukan jawaban tetapi saya tidak bisa menambahkan komentar)

Jika Anda memeriksa .bash_historykarena Anda hanya ingin menghapus perintah tertentu (misalnya berisi kata sandi yang jelas), Anda dapat langsung menghapus entri dalam memori dengan history -d <entry_id>.

Misalnya, anggaplah keluaran seperti:

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

dan Anda ingin membersihkan exportgaris, Anda bisa mencapainya dengan:

history -d 928
Eddie C.
sumber
11

bash menyimpannya dalam memori yang berfungsi, bash dapat dikonfigurasikan untuk menyimpannya ketika bash ditutup atau setelah setiap perintah, dan untuk dimuat ketika bash dimulai atau atas permintaan.

Jika Anda mengkonfigurasi untuk menyimpan setelah setiap perintah, maka pertimbangkan implikasi menjalankan banyak bash pada saat yang sama. (baris perintah akan disisipkan)

ctrl-alt-delor
sumber
2
Awal jawaban Anda membuatnya terdengar seolah-olah riwayat disimpan dalam file yang disebut bash, atau bahkan di bashexetable. Saya akan menulis "Ini disimpan oleh bashdalam memori, ..."
Anthon
itu memang lebih baik
Anthon
5

Perintah disimpan dalam memori (RAM) saat sesi Anda aktif. Segera setelah Anda menutup shell, daftar perintah ditulis .bash_historysebelum shutdown.

Dengan demikian, Anda tidak akan melihat riwayat sesi saat ini di .bash_history.

JaySo
sumber
4
File histori dimutakhirkan pada saat bashterminasi, yang tidak berarti me-reboot (terutama dalam lingkungan grafis di mana Anda dapat membuka dan menutup terminal sesuai keinginan).
John WH Smith
4

Saat berjalan, riwayat disimpan hanya dalam memori (secara default) jika:

  • set -o history (an Hin echo "$-") diatur.
  • HISTSIZE bukan 0 dan
  • HISTIGNORE bukan *(atau pola lain yang sangat membatasi).

Jika salah satu di atas gagal, tidak ada riwayat yang disimpan dalam memori dan akibatnya tidak ada riwayat yang bisa atau akan ditulis ke disk.

Riwayat dalam memori ditulis ke disk jika:

  • HISTFILESIZE bukan 0 dan
  • HISTFILE tidak disetel.

Tetapi hanya ketika shell keluar atau jika perintah history -a(tambahkan) atau history -w(tulis) dieksekusi.

Untuk memicu menulis ke disk langsung Anda dapat menggunakan variabel:

 PROMPT_COMMAND='history -a'

yang akan appendyang newgaris sejarah untuk file sejarah. Ini adalah baris sejarah yang dimasukkan sejak awal sesi bash saat ini, tetapi belum ditambahkan ke file riwayat.

Atau:

 PROMPT_COMMAND='history -w'

Untuk menimpa riwayat dalam HISTFILE dengan daftar dari memori.

Jadi, Anda dapat menghapus perintah dari sejarah di memori:

 $ 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

Dan tulis ke disk dengan perintah terakhir:

 history -w    # with `shopt -u histappend` unset
Ishak
sumber
Apakah ada yang salah dengan meletakkan ini di cron job? Saya menduga bahwa banyak pengguna dengan nama pengguna yang jauh lebih sedikit masuk ke server tertentu dan sejarah masih cukup kecil dan ini adalah server lama, tapi mungkin beberapa sesi tidak pernah ditutup ...
oneindelijk