Bash History Tidak Terjaga Antara Sesi Terminal di Mac

33

Riwayat pesta saya secara misterius berhenti bekerja, dan saya tidak tahu bagaimana cara memperbaikinya. Ini adalah .bashrc saya terlihat seperti:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Namun, ketika saya menjalankannya echo $HISTFILEmencetak /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Saya adalah pemilik file .bash_history, jadi saya tidak terlalu yakin bagaimana cara memperbaiki masalah ini.

Terima kasih!


sumber
Halo Nelson, selamat datang di Pengguna Super. Periksa cepat apakah ada spasi yang dimasukkan oleh Anda?
bertieb
ya mereka, saya akan menghapusnya dan melaporkan kembali.
@bertieb, saya telah menghapus spasi dan sekarang $ HISTFILESIZE sudah di echo dengan benar. Namun, riwayat tetap belum disimpan dan $ HISTFILE mencetak file riwayat temp yang ganjil (yang saya asumsikan menyimpan histori hanya untuk sesi itu).
Apakah Anda mencoba untuk berubah $HISTFILE, karena minat? Saya tidak memiliki .bashrcOSX dan echo $HISTFILEmelaporkan tempat yang saya harapkan - apakah mengomentari kalimat yang dimaksud berpengaruh?
bertieb
1
Selalu mengutip ekspansi variabel pathname: HISTFILE="$HOME/.bash_history”. Tanpa tanda kutip, versi Anda tidak akan valid jika jalur ke direktori home Anda berisi spasi (atau mungkin karakter khusus lainnya).
Chris Page

Jawaban:

26

Terminal menetapkan setiap sesi terminal sebagai pengidentifikasi unik dan mengkomunikasikannya melalui variabel lingkungan TERM_SESSION_ID sehingga program yang berjalan di terminal dapat menyimpan / mengembalikan status spesifik aplikasi ketika berhenti dan memulai kembali Terminal dengan Resume diaktifkan.

Folder baru (~ / .bash_sessions /) digunakan untuk menyimpan file HISTFILE dan .session yang unik untuk sesi.

Selama startup shell file sesi dieksekusi. File lama dihapus secara berkala.

Perilaku default mengatur untuk menyimpan dan mengembalikan riwayat perintah bash secara independen untuk setiap sesi terminal yang dipulihkan. Itu juga menggabungkan perintah ke dalam sejarah global untuk sesi baru.

Anda dapat menonaktifkan perilaku ini dan membagikan satu riwayat dengan pengaturan

export SHELL_SESSION_HISTORY=0

Jika HISTTIMEFORMAT didefinisikan, riwayat per sesi dinonaktifkan secara default (baca lebih lanjut di / private / etc / bashrc_Apple_Terminal)

Mekanisme save / restore dinonaktifkan jika file berikut ada:

~/.bash_sessions_disable

Apple sudah mengubah beberapa perilaku sejak El Capitan rilis, jadi lebih baik baca lebih lanjut tentang ini di sini less /private/etc/bashrc_Apple_Terminal

diimdeep
sumber
3
Tapi jangan hanya memulai dengan menonaktifkan mekanisme save / restore. Jika Anda memiliki masalah dengan riwayat perintah shell, cobalah untuk menyelesaikan masalah itu. The ~/.bash_sessions_disablefile dimaksudkan sebagai upaya terakhir dalam kasus ada masalah yang tidak dapat diselesaikan secara spesifik. Ini menonaktifkan lebih dari sekedar sejarah perintah per-sesi, dan Anda dapat menonaktifkan hanya sejarah perintah per-sesi. Lihat komentar di /etc/bashrc_Apple_Terminaluntuk detailnya.
Chris Page
1
@ ChrisPage Sebenarnya Apple mengubah beberapa bit script. Jawaban yang diperbarui, terima kasih.
diimdeep
@diimdeep Di mana saya harus menambahkan baris ini? export SHELL_SESSION_HISTORY=0
zerohedge
@zerohedge .bashrcdan .bash_profile unix.stackexchange.com/a/310150/15362
diimdeep
@diimdeep Terima kasih. Ini sepertinya berfungsi sekarang. Apakah ada konsekuensi?
zerohedge
6

Saya melihat sesuatu yang serupa setelah peningkatan El Capitan. Cukup menambahkan file .bash_sessions_disablefile di direktori home Anda menonaktifkan sesi bash baru dan .bash_historykembali digunakan.

Utas Reddit ini memiliki lebih banyak info dan tautan lebih lanjut.

rab
sumber
Tapi jangan hanya memulai dengan menonaktifkan mekanisme save / restore. Jika Anda memiliki masalah dengan riwayat perintah shell, cobalah untuk menyelesaikan masalah itu. The ~/.bash_sessions_disablefile dimaksudkan sebagai upaya terakhir dalam kasus ada masalah yang tidak dapat diselesaikan secara spesifik. Ini menonaktifkan lebih dari sekedar sejarah perintah per-sesi, dan Anda dapat menonaktifkan hanya sejarah perintah per-sesi. Lihat komentar di /etc/bashrc_Apple_Terminaluntuk detailnya.
Chris Page
Terima kasih Chris - apa lagi yang menonaktifkan riwayat saya telah berfungsi seperti yang diharapkan (sama seperti versi osx sebelumnya dan sama seperti linux) selama beberapa bulan terakhir. Tidak tahu mengapa mereka mengubahnya?
rabs
@rabs Saya sarankan menambahkan SHELL_SESSION_HISTORY=0di bagian atas ~/.bash_profile.
Teejay
5

Anda dapat memecahkan masalah RVM dengan memperbarui ke versi RVM terbaru atau menjalankan ini:

  echo 'shell_session_update' > $HOME/.bash_logout

Lihat https://github.com/rvm/rvm/issues/3540 untuk info lebih lanjut.

Alex Rojo
sumber
1
Perbaikan yang bagus, tanpa harus memodifikasi rvm.
mlo55
1
Apakah kita berbicara tentang Ruby enVironment Manager (RVM) rvm.io ?? Kapan dan mengapa itu harus dilibatkan?
MarkHu
3

Jawaban dari utas Reddit ini menyelamatkan saya:

Mungkin RVM mencegah "kait" keluar untuk menjalankan bash_sessions. Jika Anda mengomentari baris berikut di .bash_profile Anda, itu akan berfungsi.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
noio
sumber
Ini memang membantu!
Karsten
1

Jika itu adalah Mac, saya kira itu adalah shell login default bashdan itu berjalan .profilesebagai gantinya .bashrc. Jadi, Anda mengedit file yang salah.

theoden
sumber
Saya telah mengedit. Profil sehingga sama dengan .bashrc saya, dan sejarah masih belum muncul.
@NelsonLiu Apa yang terjadi ketika Anda menggema $HISTFILEdi berbagai bagian profile? Mungkin Anda sumber skrip lain yang mengubah variabel? Saya memeriksa keduanya Terminaldan iTerm, bash 3dan 4 keduanya memiliki standarnya $HOME/.bash_history.
theoden
bagaimana saya menggemakan $ HISTFILE di berbagai bagian profil?
@NelsonLiu, bukankah itu jelas? tujuan Anda adalah melacak kapan $HISTFILEperubahan itu terjadi. Jadi, cukup buat dua echo $HISTFILEmengelilingi kode Anda. Yang harus Anda lakukan adalah menemukan potongan kode di mana $HISTFILEperubahan dengan memindahkan kedua echo $HISTFILEbaris lebih dekat dan lebih dekat satu sama lain baris demi baris hingga sesuatu terungkap. Itu saja.
theoden
1
jadi saya sudah selesai seperti yang Anda perintahkan dan buat .bash_profile sama dengan profil. Saya memutuskan untuk echo $HISTFILEdi setiap baris, hanya untuk melihat apakah ada perbedaan. Namun, itu hanya dicetak /Users/username/.bash_historyberkali-kali. Saya kemudian berlari echo $HISTFILEdi shell, dan itu dihasilkan /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.
0

Saya melihat masalah ini di High Sierra. Entah bagaimana, .bash_history saya sendiri telah dimiliki oleh root dan bahkan tidak memiliki izin baca untuk pengguna lain (ketika isi direktori home dilihat dengan ls -al)

Tidak ada konsekuensi apa pun dalam file .bash_history ini, jadi saya melakukan sudo rm .bash_history diikuti oleh sentuhan .bash_history untuk membuat yang baru.

Semua tampak baik sekarang

Julian Jordan
sumber
Bagi saya, itu bukan hak akses file, itu karena saya belum mendefinisikan variabel kontrol HIST. Rupanya satu atau lebih dari mereka harus didefinisikan. Saya menambahkan ini ke ~/.bash_profilefile saya :export HISTTIMEFORMAT='%F %T '
MarkHu