Bagaimana cara mencegah perintah muncul di riwayat Bash?

96

Terkadang, ketika saya menjalankan perintah seperti rm -rf XYZ, saya tidak ingin ini dicatat dalam riwayat Bash, karena saya mungkin secara tidak sengaja menjalankan perintah yang sama lagi reverse-i-search. Adakah cara yang baik untuk mencegah hal ini terjadi?

Jeeyoung Kim
sumber
1
serverfault.com/questions/48769/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Meskipun bash dapat digunakan untuk menulis skrip shell (karenanya pemrograman), aspek khusus ini sama sekali tidak ada hubungannya dengan pemrograman (sejarah adalah hal yang hanya bersifat interaktif). Voting untuk ditutup.
paxdiablo

Jawaban:

114

Jika Anda telah menyetel HISTCONTROLvariabel lingkungan ke ignoreboth(yang biasanya disetel secara default), perintah dengan karakter spasi utama tidak akan disimpan dalam riwayat (serta duplikat).

Sebagai contoh:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

Inilah yang man bashdikatakan:

KONTROL HISTCONTROL

Daftar nilai yang dipisahkan titik dua yang mengontrol bagaimana perintah disimpan di daftar riwayat. Jika daftar nilai menyertakan ignorespace, baris yang dimulai dengan karakter spasi tidak disimpan dalam daftar riwayat . Nilai ignoredupspenyebab baris yang cocok dengan entri riwayat sebelumnya tidak disimpan. Nilai ignorebothadalah singkatan dari ignorespacedan ignoredups. Nilai erasedupspenyebab semua baris sebelumnya yang cocok dengan baris saat ini akan dihapus dari daftar riwayat sebelum baris itu disimpan. Nilai apa pun yang tidak ada dalam daftar di atas akan diabaikan. Jika HISTCONTROLtidak disetel, atau tidak menyertakan nilai yang valid, semua baris yang dibaca oleh pengurai shell disimpan di daftar riwayat, sesuai dengan nilaiHISTIGNORE. Baris kedua dan selanjutnya dari perintah gabungan beberapa baris tidak diuji, dan ditambahkan ke riwayat terlepas dari nilainya HISTCONTROL.

Lihat juga:

kenorb
sumber
53

Di .bashrc / .bash_profile / di mana pun Anda inginkan, letakkan export HISTIGNORE=' *'. Kemudian mulai saja perintah yang ingin Anda abaikan dengan satu spasi.

$ ls  # goes in history
$  ls # does not
rhdoenges.dll
sumber
4
Ini tergantung pada nilai HISTCONTROLvariabel lingkungan, yang belum tentu ignorespaceditetapkan.
sorpigal
3
Jika HISTCONTROLberisi ignorespace, sebenarnya hanya mubazir untuk menyertakan `*` di HISTIGNORE. Keduanya beroperasi secara independen.
chepner
22

Penggunaan yang lebih baik HISTIGNORE. Ini memungkinkan Anda untuk menentukan satu set pola yang akan diabaikan (seperti rm). Ini lebih baik (menurut saya) daripada hanya memasukkan semua sejarah ke dalamnya /dev/null.

bmatheny.dll
sumber
Ah ya, lupakan yang itu :)
Corey Henderson
13
kill -9 $$

Saya tahu itu tidak sebaik jawaban sebelumnya, tetapi ini akan membunuh shell Bash saat ini tanpa menyimpan apa pun, berguna ketika HISTCONTROL tidak disetel secara default, Anda lupa mengaturnya, atau murni dan sederhana Anda lupa meletakkan spasi terdepan dan Anda hanya mengetikkan beberapa sandi dan tidak ingin sandi tersebut tetap ada dalam riwayat secara permanen.

Ini adalah cara cepat, dan sesuatu seperti menghapus file riwayat tidak sebaik karena Anda perlu melakukannya di luar shell penyimpanan riwayat (masuk sebagai pengguna yang berbeda dan gunakan su / sudo, membuat pekerjaan latar belakang, dll.)

Sang penyihir
sumber
8

Anda dapat melakukan salah satu dari dua hal:

export HISTFILE=/dev/null

Atau, mulai perintah dengan spasi.

Corey Henderson
sumber
5
ruang sebelum itu luar biasa
Eric Fortis
8
Beberapa dari kita berpikir perintah pengabaian otomatis yang diawali oleh spasi adalah ide yang sangat buruk dan karena itu tidak ignorespacedisetel secara default.
sorpigal
3
Menyetel HISTFILEdengan cara ini mencegah penyimpanan riwayat apa pun , dan tidak mencegah perintah ditambahkan ke riwayat dalam memori.
chepner
3

Atau

unset HISTFILE

(mirip dengan jawaban sebelumnya hanya lebih pendek: export HISTFILE = / dev / null)

aledra
sumber
1
Ini hanya mempengaruhi riwayat dalam disk, bukan riwayat dalam memori.
chepner
2

Saat memulai shell, saya secara eksplisit membersihkan riwayat dari entri yang saya tidak ingin berada di sana. Misalnya, saya tidak ingin ada rm -rfdalam riwayat (trauma setelah menghapus direktori yang penuh dengan hasil diproses dalam semalam, hanya dengan satu Arrow-Up+ Enter:)

Saya meletakkan cuplikan berikut di file init saya (berfungsi dengan .zshrc, juga harus berfungsi dengan .bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
Jakub M.
sumber