Terkadang saya salah paham sintaksis sebuah perintah:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Saya mencoba lagi dan melakukannya dengan benar:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Bagaimana saya mencegah perintah pertama, dengan kode kesalahan berbeda dari 0, untuk memasukkan sejarah?
bash
command-history
Adam Matan
sumber
sumber
Satu-satunya cara saya bisa memikirkan untuk melakukan hal ini akan menggunakan
history -d
di$PROMPT_COMMAND
. Masalah dengan pendekatan ini atau apa pun adalah bahwa tidak mungkin untuk mengetahui apakah suatu perintah keluar dengan kesalahan atau berhasil diselesaikan dengan kode keluar yang tidak nol.sumber
Sangat baik untuk memiliki komentar yang salah terakhir untuk memperbaikinya, tetapi segera setelah itu, itu berpotensi menjadi sampah yang membingungkan.
Pendekatan saya adalah dua langkah: menyimpan perintah yang gagal ketika mereka lakukan, dan menghapusnya beberapa saat kemudian.
Menyimpan perintah yang gagal saat melakukannya:
trap command signals
dijalankancommand
ketika salah satu darisignals
"dibangkitkan".$(command)
, menjalankancommand
dan menangkap hasilnya.Ketika perintah gagal, potongan kode ini menangkap nomor sejarah dari perintah terakhir yang disimpan ke dalam sejarah , dan menyimpannya dalam variabel untuk dihapus di masa depan.
Sederhana, tetapi bekerja secara tidak benar dengan
HISTCONTROL
danHISTIGNORE
- ketika perintah tidak disimpan ke dalam riwayat karena salah satu variabel, jumlah riwayat dari perintah terakhir yang disimpan ke dalam sejarah adalah perintah sebelumnya; jadi, jika perintah yang salah tidak disimpan ke dalam riwayat, perintah sebelumnya akan dihapus.Versi yang sedikit lebih rumit, yang berfungsi dengan benar dalam hal ini:
Hapus perintah yang disimpan beberapa saat kemudian:
Penjelasan:
Saat keluar dari Bash, untuk setiap nomor riwayat unik hapus entri riwayat yang sesuai,
lalu hapus
FAILED_COMMANDS
untuk tidak menghapus perintah yang mewarisi nomor riwayat dari perintah yang sudah dihapus.Jika Anda yakin itu
FAILED_COMMANDS
akan bebas dari duplikat, Anda dapat melakukannya dengan sederhana(mis. Menulis
for i in $FAILED_COMMANDS
). Namun, jika Anda mengharapkannya tidak diurutkan dari yang terbesar ke yang terkecil (dalam hal ini selalu demikian), gantiuniq
dengansort -rnu
.Nomor histori di
FAILED_COMMANDS
harus unik dan diurutkan dari yang terbesar ke yang terkecil, karena ketika Anda menghapus entri, nomor perintah selanjutnya digeser - yaitu. saat Anda mengeluarkanhistory -d 2
, entri ke-3 menjadi ke-2, ke-4 menjadi ke-3, dll.Karena itu, ketika menggunakan kode ini, Anda tidak dapat secara manual memanggil di
history -d <n>
mana
n
lebih kecil atau sama dengan jumlah terbesar yang tersimpanFAILED_COMMANDS
dan berharap kode tersebut berfungsi dengan baik.
Ini mungkin ide yang baik untuk menghubungkan
exit_handler
diEXIT
, tetapi Anda juga dapat menghubungi kapan saja sebelumnya.sumber