Untuk mencegah masuknya perintah "berbahaya" dalam sejarah bash, saya telah menambahkan baris berikut ke .bashrc
file saya :
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
ini bekerja dengan baik, tetapi memiliki efek samping: Saya tidak dapat melihat riwayat lengkap perintah yang dijalankan pada mesin. Katakanlah saya memiliki beberapa mesin untuk percobaan, dan saya ingin dapat melihat semua perintah dieksekusi. Saya akan menggunakan bash internal history
untuk menampilkan perintah yang dieksekusi, dan mungkin grep untuk tanggal hari ini:
history | grep Sep-28
Apa yang ingin saya miliki adalah mencatat perintah "berbahaya" juga, tetapi letakkan #
di awal baris, sehingga jika saya mengeksekusi perintah secara tidak sengaja, tidak ada kerusakan yang akan terjadi.
Saya tidak tahu apakah ini mungkin.
Pembaruan dan klarifikasi:
Alasan utama mengapa ini menjadi masalah bagi saya adalah bahwa saya biasanya terhubung ke mesin saya dari beberapa terminal, dan perintah apa pun yang dijalankan pada satu terminal segera dibaca ke dalam sejarah terminal lain. Ini dicapai oleh
PROMPT_COMMAND="history -a; history -c; history -r"
Bayangkan saya memiliki dua terminal terbuka. Dalam satu saya menjalankan beberapa cat /dev/foo > file.out
proses. Di bagian kedua, saya memeriksa perkembangannya ls -lAhF
. Saya terus mengulangi ls
dengan menekan Updan ENTER(yaitu, perintah terakhir dari sejarah). Segera setelah perintah pertama selesai, perintah terakhir dari history tidak lagi ls
, tetapi cat /dev/foo > file.out
. Jika saya tidak hati-hati, saya akan mulai cat lagi dan menimpa file.out.
Yang ingin saya capai adalah bahwa perintah cat akan didahului dengan #
, sehingga tidak akan dieksekusi. Saya akan, bagaimanapun, masih melihatnya dalam sejarah dan dapat menggunakannya kembali (jika itu adalah perintah yang panjang) dengan tidak berkomentar.
sumber
watch ls -lAhF
atauwhile sleep 1; do ls -lAhf; done
; alih-alih menonton ukuran file, Anda dapat menggunakanpv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ).Jawaban:
Anda dapat melakukan sesuatu seperti:
Idenya adalah bahwa sebelum setiap prompt, kami memeriksa entri riwayat terakhir (
history 1
) dan jika itu salah satu yang berbahaya , kami menghapusnya (history -d
) dan menambahkannya kembali dengan#
withhistory -s
.(jelas, Anda perlu menghapus
HISTIGNORE
pengaturan Anda ).Efek samping yang tidak diinginkan dari itu adalah bahwa itu mengubah waktu sejarah mereka
rm
,mv
... perintah.Untuk memperbaikinya, sebuah alternatif bisa berupa:
Kali ini, kami mencatat waktu riwayat terakhir, dan untuk menambah kembali baris riwayat, kami menggunakan
history -r
dari file sementara (dokumen di sini) yang menyertakan stempel waktu.Anda ingin
fixhist
tampil sebelum Andahistory -a; history -c; history -r
. Sayangnya, versibash
bug saathistory -a
ini tidak menyimpan baris tambahan yang telah kami tambahkan. Sebagai gantinya adalah menulisnya:Itu adalah untuk menambahkan sendiri perintah yang sudah dikomentari ke HISTFILE daripada membiarkannya
history -a
melakukannya.sumber
cmd=${cmd#*[0-9] }
fungsinya? Dan di mana tepatnya saya harus meletakkanfixhist
diPROMPT_COMMAND
? Saat ini, sudah berisiPROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? Saya sudah mengaturexport HISTTIMEFORMAT="%b-%d %H:%M "
. By the way, ketika saya menambahkan kode Anda ke saya$HOME/.bashrc
, tidak ada yang terjadi.HISTTIMEFORMAT=/
hanya untuk satu permintaanhistory
untuk mendapatkan output seperti di123 /rm x
mana lebih mudah untuk mengekstrak cmd. Ada masalah dengan beberapa versi dibash
mana$HISTCMD
palsu dalam konteks itu, coba versi baru.#
kode tidak bertindak sebagai komentar.bashrc
?bash
menyisipkan*
setelah jumlah sejarah yang tidak diharapkan. Harus diperbaiki sekarang.Saya tidak akan menjawab pertanyaan Anda dengan tepat, tetapi mungkin memberi Anda solusi alternatif untuk masalah Anda.
Jika saya mengerti benar Anda khawatir tentang kesalahan yang bisa Anda buat dengan mengetik, misalnya,
!rm
jika itu terjadi bahwarm
perintah sebelumnya dalam sejarah menghapus sesuatu yang ingin Anda simpan.Dalam hal ini, opsi bash yang bagus adalah
histverify
. Jika Andashopt -s histverify
, dan jika Anda ingat perintah dengan bang!
, itu tidak akan segera dieksekusi, tetapi dimuat di readline sehingga Anda dapat memutuskan untuk mengeksekusinya atau tidak, dan ini juga memberi Anda kemungkinan untuk mengeditnya.Cobalah:
Tanpa
histverify
:Dengan
histverify
:Dalam hal ini Anda akan memiliki kursor di akhir baris, siap untuk meluncurkannya lagi - atau tidak - atau mengeditnya.
Jika Anda menyukai opsi ini, letakkan di
.bashrc
:sumber