Jalankan perintah tanpa menyimpannya dalam riwayat [tertutup]
203
Saya ingin menjalankan beberapa perintah tetapi tidak ingin menyimpannya dalam sejarah perintah. Sehingga tak seorang pun akan dapat mencarinya di .bash_historyfile.
Apakah ada cara bagaimana menjalankan perintah bash dengan cara ini?
Pertanyaan ini mungkin harus dipindahkan ke ServerFault karena ini bukan "pemrograman" sebanyak "admin server" - tetapi terima kasih atas pertanyaan / jawaban, tepat apa yang saya butuhkan!
Andrew Theken
Jawaban:
294
Mulai perintah Anda dengan spasi dan itu tidak akan dimasukkan dalam sejarah.
Ketahuilah bahwa ini memerlukan variabel lingkungan $HISTCONTROLuntuk diatur.
kemudian lanjutkan dengan perbuatan licik Anda. Mengatur histfile agar /dev/nullakan dicatat ke file histori, namun entri ini akan segera dihapus dan tidak ada jejak (setidaknya dalam file histori) akan ditampilkan.
Ini sudah dijawab berkali-kali. Apa yang akan Anda katakan jawaban Anda ditambahkan ke utas ini (kecuali untuk kebisingan yang tidak berguna)?
gniourf_gniourf
Itu tidak disatukan dalam satu jawaban , sehingga tidak memiliki perintah itu sendiri muncul dalam sejarah dan tidak memiliki apa pun muncul yang dimasukkan sesudahnya.
Christian
1
Tapi sekarang utas ini benar-benar berantakan! dalam hal ini, terutama untuk pertanyaan lama seperti itu, saya yakin lebih baik Anda mengedit jawaban yang sudah ada, dan / atau memberikan komentar ...
gniourf_gniourf
5
Seperti yang disebutkan oleh Doodad dalam komentar , unset HISTFILEmelakukan ini dengan baik, tetapi jika Anda juga ingin juga menghapus beberapa riwayat, lakukan echo $HISTFILEuntuk mendapatkan lokasi file riwayat (biasanya ~/.bash_history) unset HISTFILE, dan edit ~/.bash_history(atau apa pun HISTFILEitu - tentu saja sekarang unsetsehingga Anda dapat ' t membacanya).
$ echo $HISTFILE # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history # Or your preferred editor
Kemudian Anda telah mengedit riwayat Anda, dan fakta bahwa Anda telah mengeditnya!
Sudah mencoba ini: GNU bash, versi 3.2.57 (1) -release (x86_64-apple-darwin15) dan tidak berfungsi. Perintah yang saya gunakan setelah HISTORY yang tidak disetel disimpan di ~ / .bash_history
Krystian
@Krystian Kesalahan saya - saya telah menulis "unset HISTORY" padahal seharusnya "unset HISTFILE" - dikoreksi. Apakah ini berfungsi sekarang? Ini bekerja pada GNU bash, versi 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel
baik saya tidak yakin. Tes sederhana: unset HISTFILE; echo TEST; historyakan memberi Anda perintah echo TESTseperti sebelumnya ke yang terakhir. Meskipun setelah mengakhiri sesi dan terhubung lagi, sejarah tidak memiliki entri ini. Jadi saya akan mengatakan itu bekerja :)
Krystian
unset HISTFILEtampaknya tidak menghentikan perintah yang direkam dalam riwayat dalam memori, tetapi itu menghentikan mereka yang direkam dalam file apa pun yang $ HISTFILE. Jadi saya kira Anda masih memiliki sejarah lokal di memori, tetapi tidak direkam dalam file lagi, yang mungkin Anda inginkan! ;)
drkvogel
4
Anda juga dapat menggunakan perintah berikut:
echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')
Saya telah membuat alias dari ini: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"dan sekarang Anda dapat melakukannya seperti ini:mysql -uroot -pSecretPassword ; forget
sobi3ch
1
Maaf, tapi saya sadar Anda perlu membuat fungsi alih-alih alias karena tanda kutip mengubah makna $sdan hal-hal lain dalam sed. function forget() { // put code here // }
sobi3ch
3
Jika Anda menggunakan zsh, Anda dapat menjalankan:
setopt histignorespace
Setelah ini diatur, setiap perintah yang dimulai dengan spasi akan dikecualikan dari sejarah.
Anda dapat menggunakan alias dalam .zshrcuntuk mengubah ini on / off :
# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'
alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'
Bagus, tetapi pertanyaan ini secara khusus ditandai bash
tripleee
2
Ada beberapa cara untuk mencapai hal ini. Ini menetapkan ukuran file riwayat ke 0:
export HISTFILESIZE=0
Ini mengatur file histori untuk /dev/null, secara efektif menonaktifkannya:
export HISTFILE=/dev/null
Untuk perintah individual, Anda bisa mengawali perintah dengan spasi dan itu tidak akan disimpan dalam file histori. Perhatikan bahwa ini mengharuskan Anda memiliki ignorespacenilai yang termasuk dalam $HISTCONTROLvariabel lingkungan (man bash dan cari ignorespacedetail lebih lanjut).
Ini menonaktifkan riwayat untuk semua perintah di masa depan, bukan untuk perintah individu. Kebanyakan orang yang datang ke sini harus melihat jawaban yang diterima sebagai gantinya.
tripleee
Ini valid, atau oke tapi tidak lengkap. Selama kita menambahkan perintah kebalikan set -x historysetelah itu, itu berfungsi.
Abdillah
0
Perintah ini mungkin berguna. Ini tidak akan merekam perintah yang dieksekusi
Jawaban:
Mulai perintah Anda dengan spasi dan itu tidak akan dimasukkan dalam sejarah.
Ketahuilah bahwa ini memerlukan variabel lingkungan
$HISTCONTROL
untuk diatur.Periksa apakah perintah berikut mengembalikan
ignorespace
atauignoreboth
Untuk menambahkan variabel lingkungan jika tidak ada, baris berikut dapat ditambahkan ke profil bash. Misalnya
%HOME/.bashrc
Setelah sumber profil lagi perintah ruang awalan tidak akan ditulis
$HISTFILE
sumber
Di setiap sesi Bash yang diberikan, setel file riwayat ke / dev / null dengan mengetik:
Perhatikan bahwa, sebagaimana ditunjukkan dalam komentar, ini tidak akan menulis perintah apa pun di sesi itu ke riwayat!
Hanya saja, jangan main-main dengan kerja keras administrator sistem Anda, tolong;)
Solusi Doodad lebih elegan. Cukup atur variabel:
unset HISTFILE
(terima kasih!)sumber
/dev/null
izin yang diatur ke 0600 pada saat logout. Sebaliknya saya menggunakanunset HISTFILE
.sumber
Perpanjangan dari jawaban @John Doe & @ user3270492. Tapi, ini sepertinya berhasil untukku.
Anda seharusnya tidak melihat entri perintah dalam riwayat Anda.
Inilah penjelasannya ..
'History -d' menghapus entri yang disebutkan dari histori.
HISTCMD menyimpan nomor perintah dari yang akan dieksekusi selanjutnya. Jadi, (HISTCMD-1) mengacu pada perintah yang dieksekusi terakhir.
Hapus baris tertentu dari file Bash history
sumber
Anda mungkin mempertimbangkan menggunakan shell tanpa histori, seperti mungkin
(mungkin
/bin/dash
atau/bin/sash
bisa lebih tepat daripada/bin/sh
)atau bahkan lebih baik menggunakan utilitas batch mis
Sejarah akan berisi
sh
ataubatch
yang tidak terlalu berartisumber
Anda dapat memulai sesi Anda dengan
kemudian lanjutkan dengan perbuatan licik Anda. Mengatur histfile agar
/dev/null
akan dicatat ke file histori, namun entri ini akan segera dihapus dan tidak ada jejak (setidaknya dalam file histori) akan ditampilkan.Juga, ini tidak permanen.
sumber
Seperti yang disebutkan oleh Doodad dalam komentar ,
unset HISTFILE
melakukan ini dengan baik, tetapi jika Anda juga ingin juga menghapus beberapa riwayat, lakukanecho $HISTFILE
untuk mendapatkan lokasi file riwayat (biasanya~/.bash_history
)unset HISTFILE
, dan edit~/.bash_history
(atau apa punHISTFILE
itu - tentu saja sekarangunset
sehingga Anda dapat ' t membacanya).Kemudian Anda telah mengedit riwayat Anda, dan fakta bahwa Anda telah mengeditnya!
sumber
unset HISTFILE; echo TEST; history
akan memberi Anda perintahecho TEST
seperti sebelumnya ke yang terakhir. Meskipun setelah mengakhiri sesi dan terhubung lagi, sejarah tidak memiliki entri ini. Jadi saya akan mengatakan itu bekerja :)unset HISTFILE
tampaknya tidak menghentikan perintah yang direkam dalam riwayat dalam memori, tetapi itu menghentikan mereka yang direkam dalam file apa pun yang $ HISTFILE. Jadi saya kira Anda masih memiliki sejarah lokal di memori, tetapi tidak direkam dalam file lagi, yang mungkin Anda inginkan! ;)Anda juga dapat menggunakan perintah berikut:
Saya pikir itu perintah yang sangat portabel.
sumber
alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"
dan sekarang Anda dapat melakukannya seperti ini:mysql -uroot -pSecretPassword ; forget
$s
dan hal-hal lain dalam sed.function forget() { // put code here // }
Jika Anda menggunakan zsh, Anda dapat menjalankan:
Setelah ini diatur, setiap perintah yang dimulai dengan spasi akan dikecualikan dari sejarah.
Anda dapat menggunakan alias dalam
.zshrc
untuk mengubah ini on / off :sumber
Ada beberapa cara untuk mencapai hal ini. Ini menetapkan ukuran file riwayat ke 0:
Ini mengatur file histori untuk
/dev/null
, secara efektif menonaktifkannya:Untuk perintah individual, Anda bisa mengawali perintah dengan spasi dan itu tidak akan disimpan dalam file histori. Perhatikan bahwa ini mengharuskan Anda memiliki
ignorespace
nilai yang termasuk dalam$HISTCONTROL
variabel lingkungan (man bash dan cariignorespace
detail lebih lanjut).sumber
Ini berguna jika Anda ingin menghapus semua sejarah, termasuk fakta bahwa Anda menghapus semua sejarah!
sumber
Anda hanya perlu menjalankan:
$ set +o history
Untuk melihat lebih banyak, jalankan:
$ man set
sumber
set -x history
setelah itu, itu berfungsi.Perintah ini mungkin berguna. Ini tidak akan merekam perintah yang dieksekusi
sumber