Jawaban:
Apakah Anda ingin berfungsi tanpa mengetik perintah tambahan, mis
$ rm file
Atau hanya ketika pengguna mengetik sesuatu seperti
$ confirm rm file
Atau hanya ketika pengguna mencoba menjalankan perintah tertentu, mis
$ rm file
tapi tidak untuk
$ echo "Hello"
Jika opsi 1, itu bisa dilakukan dengan menggunakan preexec hook di zsh, atau perangkap DEBUG di bash.
Jika opsi 2, masukkan sesuatu seperti ini di /etc/bash.bashrcatau file startup shell lainnya.
confirm() {
echo -n "Do you want to run $*? [N/y] "
read -N 1 REPLY
echo
if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
"$@"
else
echo "Cancelled by user"
fi
}
Jika opsi 3, Anda dapat memodifikasi confirmskrip di atas, atau, beberapa perintah memiliki opsi untuk bertanya sebelum melakukan sesuatu, misalnya rm -i. Anda bisa menempatkan
alias rm='rm -i'di /etc/bash.bashrc.
Saya telah bermain dengan bash sedikit dan menemukan hack yang memungkinkan ini terjadi.
#!/bin/bash
debug_trap () {
echo "executing $BASH_COMMAND"
echo "Allow?"
select choice in yes no
do
if [ "$choice" = "yes" ]
then break
elif [ "$choice" = "no" ]
then return 1
fi
done
}
shopt -s extdebug
trap debug_trap DEBUG
Anda dapat menyimpan skrip ini di bawah, misalnya, confirm-any-command.shdan sourcedi skrip Anda bashrc. Ini akan meminta konfirmasi dari setiap perintah yang akan Anda coba jalankan.
Harap dicatat bahwa ini tidak lebih dari peretasan proof-of-concept; Saya ragu itu bisa benar-benar bermanfaat dalam bentuk ini. Jika Anda harus mengkonfirmasi setiap perintah yang Anda ketikkan, Anda akan segera mendapatkan kebiasaan untuk secara otomatis menekan "ya" setelah setiap perintah. Pemetaan mental Anda untuk "akhir perintah" akan berubah dari hanya Enteruntuk Enter, yes, Enter- Anda akan mengetik itu secara keseluruhan, bahkan tidak mencoba untuk menghabiskan beberapa waktu di memverifikasi bahwa Anda benar-benar ingin perintah ini untuk mengeksekusi. Ini kontraproduktif dan tidak akan membantu Anda.
Allow? 1) yes 2) no #? baik yesatau nobekerja menyebabkan loop tak terbatas (Debian 8)
help select: Anda seharusnya memasukkan 1atau 2bukan yesatau no. Retry otomatis untuk input yang tidak valid adalah perilaku yang dimaksudkan (sehingga penulis skrip tidak harus menemukan kembali whiledirinya sendiri, mempertahankan keringkasan dan kejelasan), dan input EOF mengakhiri loop. Mengetahui hal itu, Anda dapat memeriksa sendiri bahwa skrip di atas berfungsi. Saya tidak akan memodifikasinya, karena itu merupakan bukti konsep yang kasar.
y e s Entercontoh Anda
cddanls?