Bagaimana mencegah Bash mengubah riwayat?

26

Jika saya menekan panah Atas atau Bawah pada keyboard saya dan kemudian memodifikasi sesuatu dari riwayat saya, itu berubah selamanya. Bahkan jika saya menekan Ctrl-C dan kemudian mencoba untuk memunculkannya lagi, itu masih berubah - Saya telah kehilangan entri itu dalam sejarah saya.

Bagaimana saya bisa mencegah hal ini terjadi?

Mehrdad
sumber
3
Saya suka judul pertanyaan ini. Anda benar-benar dapat mengubah riwayat dan Anda mengeluh? Apa yang salah denganmu?!
Daniel Beck
@Aniel: Lol, yeah ... Maksudku, seolah-olah aku mengubah masa laluku. Jelas tidak masuk akal, dan itu akan sangat mengganggu setelah beberapa saat. : \
Mehrdad
Btw, jika Anda menggunakan histori-search-xxx , perilakunya berbeda. Mungkin itu sesuatu untukmu?
Daniel Beck
@Aniel: Itu memang berguna - terima kasih banyak. Tapi tetap saja, saya ingin tahu jawaban untuk pertanyaan ini, karena kadang-kadang perintah tidak begitu mirip satu sama lain, dan itu tidak berhasil.
Mehrdad
pencarian histori dengan prompt kosong berfungsi seperti riwayat reguler prev / next, yaitu menampilkan semua entri.
Daniel Beck

Jawaban:

17

Anda ingin pengaturan readline:

set revert-all-at-newline on

Anda dapat memasukkannya ~/.inputrc(lihat catatan di bawah), atau memasukkannya bind 'revert-all-at-newline on'ke ~/.bashrc.

Demo:

$ man bash
$ bind 'set revert-all-at-newline on'
$ man bsh # up arrow and edit
No manual entry for bsh
$ man bash # three up arrows

Rincian lebih lanjut ada di halaman manual Bash :

revert-all-at-newline

Jika disetel ke ' on', Readline akan membatalkan semua perubahan ke baris riwayat sebelum kembali ketika garis-terima dijalankan. Secara default, baris histori dapat dimodifikasi dan mempertahankan setiap daftar undo yang terpisah antar panggilan ke readline. Standarnya adalah ' off'.


catatan:

Jika ~/.inputrcfile baru dibuat untuk tujuan pengaturan revert-all-at-newline, ketahuilah bahwa bash akan menggunakan pengaturan readline dalam file ini alih-alih pengaturan apa pun yang mungkin ada dalam file tersebut /etc/inputrc. Artinya, pengaturan apa pun yang ditentukan /etc/inputrctidak akan berlaku lagi. Oleh karena itu, jika /etc/inputrcfile ada, sebaiknya mulai ~/.inputrcdengan baris:

$include /etc/inputrc

sarnold
sumber
Anda luar biasa, itulah yang saya butuhkan. Saya tidak lagi ingin meninju monitor saya. : D +1000000 (saya berharap)
Mehrdad
5

Saya masuk:

ls /tmp

- hebat. Sekarang saya tidak mau masuk

ls /temp 

dan dapat mencegahnya untuk memasukkan histori, oleh karena itu mencegahnya untuk menimpa ls / tmp, jika saya memulai perintah dengan kosong:

 ls /temp

Sulit dilihat, tetapi jika Anda mengetahuinya ...

Itu dikendalikan oleh

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth

ignoredups hanya mengabaikan perintah yang diduplikasi, ignoreboth mengabaikan spasi di awal baris, yang berguna, untuk menyembunyikan kata sandi yang tidak diinginkan.

Tapi mungkin Anda keluar untuk solusi, di mana Anda berakhir dengan kedua perintah, yang lama tidak dimodifikasi, dan yang baru. Versi bash atau pengaturan saya berperilaku seperti ini, tetapi saya tidak tahu, apa yang berbeda dengan Anda.

Pengguna tidak diketahui
sumber
Ha; Saya selalu berasumsi bahwa tidak menyimpan perintah dengan ruang terdepan adalah bug. Terima kasih. :)
sarnold