Untuk beberapa alasan, saya tidak bisa mendapatkan sistem saya untuk menyimpan riwayat BASH saya setelah reboot. Berikut adalah bagian yang relevan dari saya ~/.bashrc
:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Sejauh yang saya tahu itu semua adalah opsi yang diperlukan (saya tahu saya dulu bisa menyimpan sejarah di beberapa reboot tanpa semua ini di masa lalu). Namun, meskipun telah menambahkan opsi ini beberapa reboot lalu, saya masih kehilangan sebagian besar sejarah saya setelah reboot. Ini tidak kosong, tetapi tidak memiliki garis 9999 yang saya miliki sebelum me-reboot.
Sebelum ada yang mengeluh, ya saya sudah baca pertanyaan ini. Saya telah menerapkan beberapa saran mereka sebagaimana tercantum di atas, sisanya tidak membantu atau tidak relevan:
- Hilang riwayat Bash saat menggunakan histappend
- Bagaimana mencegah Bash mengubah riwayat?
- Apa yang menentukan apa yang muncul di perintah bash history?
- Bagaimana cara menjaga riwayat bash saya di seluruh sesi?
- simpan bash history, secara teratur
Jika ada perintah lain yang relevan di sana, Anda dapat melihat keseluruhan saya di ~/.bashrc
sini .
Jadi, apa yang saya lewatkan? Mengapa riwayat saya tidak disimpan? Jika ada yang berpikir file lain mungkin relevan beri tahu saya dan saya akan mempostingnya. Saya memeriksa dengan menjalankan grep -i hist \.*
di saya $HOME
yang menunjukkan bahwa satu-satunya .
file yang relevan berisi string hist
atau HIST
itu .bashrc
.
Saya menjalankan Linux Mint Debian Edition, GNU bash, versi 4.2.36 (1) -release (x86_64-pc-linux-gnu) dan terminal emulator favorit saya (dalam kasus yang relevan) adalah terminator
.
MEMPERBARUI:
Mengikuti saran @ mpy di komentar, saya mengubah ~/.bashrc
pengaturan saya HISTFILE=~/bash_history
sebagai kebalikan dari default ~/.bash_history
dan yang tampaknya memecahkan masalah untuk shell interaktif . Cangkang login masih menampilkan perilaku yang sama, dengan riwayat terpotong pada 500
baris. Namun, tidak ada HIST
variabel terkait yang diatur dalam file yang relevan:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Jadi, mengapa pengaturan HISTSIZE
dan HISTFILESIZE
dalam ~/.bashrc
tidak cukup kecuali saya secara eksplisit mengatur $HISTFILE
sesuatu selain default ~/.bash_history
?
history
perintah, output yang Anda lihat identik dengan apa yang Anda lihat, jalankancat .bash_history
, selain nomor baris? Maksud saya apakahhistory
waktu daftar perintah perangko atau informasi lainnya? Alasan saya bertanya adalah, jika Anda melihat hal-hal esoterik ini, itu berarti, ada modul / fungsi / program lain, yang mengacaukan sejarah shell dan versi yang salah atau kereta apa pun itu, mungkin menyebabkan Anda bersedih. .;)
: Coba file lain sebagai HISTFILE, bukan default~/.bash_history
. Penjelasan yang sangat dikonstruksi: Saya menganggap bash adalah shell default Anda, jadi pada sistem start shell non-interaktif adalah induk dari sesi X Anda (saya juga menganggap Anda menggunakan X), yang tidak akan tahu apa-apa tentang opsi histappend (karena .bashrc hanya dibaca oleh shell interaktif), sehingga selama shell induk ini berjalan semuanya baik-baik saja, tetapi setelah penghentian (yaitu sistem berhenti) itu akan menimpa~/.bash_history
(yang default) dan mengacaukan sejarah Anda ...Jawaban:
Masalahnya sebenarnya bermuara pada perilaku berbeda dari shell masuk dan non-login. Saya telah menetapkan variabel yang mengontrol riwayat di file saya
~/.bahsrc
. File ini tidak dibaca ketika seseorang memulai shell login, itu hanya dibaca oleh shell interaktif, non-login (dariman bash
):Oleh karena itu, setiap kali saya login, atau turun menjadi tty, atau menggunakan ssh,
.history
file semakin terpotong karena saya belum mengaturnya ke ukuran yang tepat~/.profile
juga. Saya akhirnya menyadari ini dan hanya mengatur variabel di~/.profile
tempat mereka berada , bukan~/.bashrc
Jadi, alasan saya
~/.history
terpotong adalah karena saya hanya mengatur variabel SEJARAH dalam file yang dibaca oleh shell non-login yang interaktif dan oleh karena itu setiap kali saya menjalankan tipe shell yang berbeda, variabel akan diabaikan dan file akan dipotong demikian.sumber
.bashrc
tidak dibaca oleh (shell non-interaktif ATAU login).export BASH_ENV=~/.bashrc ; if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
... dan di bagian atas ~ / .bashrc beri tanda centang untuk memastikan Anda benar-benar berjalan secara interaktif:[ -z "$PS1" ] && return
... Tentu saja, itu hanya sebuah idiom.BASH_ENV
tidak relevan, hanya memengaruhi shell yang tidak interaktif. Adapun "idiom", itu adalah sesuatu yang Debian mulai dan dengan yang saya pribadi tidak setuju. Saya sering memiliki opsi grafis (xset
dan sejenisnya) di .bashrc saya dan saya tidak ingin yang aktif ketika saya menjalankan shell login baik dari tty atau melaluissh
. Saya ingin .profile dan .bashrc saya terpisah. Banyak (walaupun tidak semua) sumber masuk manajer. Profil ketika Anda masuk sehingga variabel global paling baik diatur di sana di mana mereka hanya akan dibaca sekali dan tidak setiap kali Anda membuka terminal.~/.profile
atau~/.bashrc
) dibaca terakhir. Apa pun yang diatur dalam mereka akan diutamakan daripada pengaturan global. Anda benar, Anda seharusnya tidak mengatur variabel-variabel tersebut di/etc/bash.bashrc
. Gunakan~/.profile
(atau~/.bash_profile
) sebagai gantinya.Saran saya adalah menggunakan file lain sebagai
HISTFILE
, bukan default~/.bash_history
.Meskipun saya tidak memiliki penjelasan analitis, saya akan mencoba untuk menguraikan apa yang menuntun saya ke saran ini: Jika Anda menggunakan
bash
shell (login) default Anda dan juga menggunakanX
(yang keduanya sangat mungkin), Anda memilikibash
instance yang berjalan tepat setelah (grafis) ) Gabung:Saya pikir contoh ini adalah shell login, jadi itu tidak membaca Anda
~/.bashrc
dan karenanya tidak akan tahu apa-apa tentanghistappend
opsi:Selama "shell orangtua" ini berjalan, semuanya baik-baik saja, tetapi setelah dihentikan (yaitu sistem berhenti) itu akan menimpa
~/.bash_history
(karena itu nilai default) dan mengacaukan riwayat Anda atau klip itu pada sistem mulai (lagi default) 500 garis. (Atau mungkin keduanya ...)Ini mengejutkan saya juga, bahwa tidak cukup untuk memasukkan konfigurasi sejarah
~/.bashrc
, karena ini seharusnya tidak menjadi pengaturan yang tidak biasa. Saya tidak punya penjelasan untuk itu.Mengenai masalah Anda, bahwa "Shell login masih menampilkan perilaku yang sama", Anda dapat mencoba untuk memasukkan konfigurasi sejarah juga di
~/.bash_profile
:Sayangnya saya tidak dapat memposting penjelasan yang lebih tepat dengan detail dari
bash
konfigurasi saya sendiri , karena saya seorangzsh
pria ...sumber
~/.bash_profile
memecahkan masalah. Saya sekarang menggunakan~/.bash_history
sebagai file riwayat saya tetapi hanya menambahkan semua baris dari yang~/.bashrc
ditunjukkan dalam pertanyaan saya ke~/.bash_profile
. Masih tidak yakin siapa yang mengacaukan kerang interaktif, tetapi tampaknya berfungsi sekarang, terima kasih!Karena semua pengaturan Anda sesuai dengan halaman manual, dan karena file histori tidak dibatasi oleh ukuran (byte), satu-satunya penjelasan yang mungkin bisa saya pikirkan. Itu ada hubungannya dengan bagaimana cangkangnya mati.
Menurut referensi online, jalan keluar yang anggun (histori disimpan) hanya terjadi ketika shell menerima SIGHUP. Saya tidak bisa menjelaskan bagaimana sistem Anda menyebarkan sinyal ketika dinyalakan kembali, tetapi saya menduga bahwa shell Anda berhenti dengan SIGKILL atau SIGPWR.
Mungkin karena WM Anda berjalan secara tidak sinkron (tunggu) dan emulator terminal muncul dari WM di mana bash mendapatkan sinyal pemaksaan keluar selain SIGHUP. Bisa juga bahwa OS adalah untuk dengan cepat mengirim "final kill" ke semua proses sebelum SIGHUP yang anggun berhasil mencapai shell melalui X -> WM -> xterm, mungkin karena X atau WM membutuhkan waktu lebih lama untuk keluar daripada dibutuhkan agar OS siap turun.
Saya berada di perairan yang dalam dengan hal-hal ini, tetapi saya pikir sesuatu di sepanjang garis itu menyebabkan perilaku yang tidak menentu. Saya pernah mengalami masalah ini sebelumnya, dan obat yang paling kuat ada
exit
di bash di mana Anda ingin menyimpan sejarah.Saya perhatikan
history -a
dalam pertanyaan Anda, dan saya tidak bisa memikirkan mengapa itu tidak cukup untuk melestarikan sejarah.Anda bisa memecahkan masalah dengan mencari tahu apa yang benar-benar membunuh bash Anda dan beralih ke mencari tahu di mana sinyal berasal dan memperbaiki masalah di sana, atau hanya menyiram sejarah ketika Anda tahu sinyal mana yang terakhir (dengan asumsi disk masih online saat itu ):
Tangkapan layar yang disertakan menggambarkan apa yang saya bicarakan di paragraf kedua dan ketiga. Urutan ada saya shell dari kiri , bunuh shell kiri dari kanan dan cat sejarah.
bash bash
referensi online
tangkapan layar demonstratif
sumber
/tmp/pso
yang kau bunuh? Saya mengerti maksud Anda tentang berbagai sinyal membunuh (meskipun seperti yang Anda katakan, saya pikir itulah yanghistory -a
harus dihadapi). Saya akan mengujinya sebentar dan melaporkannya kembali.Periksa / etc / profile dan /etc/profile.d/*
Mungkin ada sesuatu yang mengacaukan pengaturan sejarah di sana.
sumber
grep -r HIST /etc/profile.d/
tidak mengembalikan apa pun, dan saya sudah memeriksanya/etc/profile
.