Câu trả lời:
Bạn có muốn nó hoạt động mà không cần gõ thêm một lệnh không, vd
$ rm file
Hoặc chỉ khi người dùng gõ một cái gì đó như
$ confirm rm file
Hoặc chỉ khi người dùng cố gắng chạy một số lệnh nhất định, ví dụ:
$ rm file
nhưng không cho
$ echo "Hello"
Nếu tùy chọn 1, điều đó có thể được thực hiện bằng cách sử dụng hook preexec trong zsh hoặc bẫy DEBUG trong bash.
Nếu tùy chọn 2, đặt một cái gì đó như thế này vào /etc/bash.bashrc
hoặc tập tin khởi động shell khác.
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
}
Nếu tùy chọn 3, bạn có thể sửa đổi confirm
kịch bản ở trên, hoặc, một số lệnh có một tùy chọn để hỏi trước khi làm điều gì đó, ví dụ rm -i
. Bạn có thể đặt
alias rm='rm -i'
vào /etc/bash.bashrc
.
Tôi đã chơi với bash một chút và tìm ra một bản hack mà điều này có thể được thực hiện.
#!/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
Bạn có thể lưu tập lệnh này bên dưới, nói confirm-any-command.sh
và source
trong tập lệnh của bạn bashrc
. Nó sẽ yêu cầu xác nhận từng lệnh bạn sẽ cố gắng thực hiện.
Xin lưu ý rằng đây không gì khác hơn là một bản hack bằng chứng; Tôi nghi ngờ nó thực sự có thể hữu ích trong hình thức này. Nếu bạn sẽ phải xác nhận từng lệnh bạn nhập, bạn sẽ sớm có thói quen tự động nhấn "có" sau mỗi lệnh. Lập bản đồ tinh thần của bạn cho "kết thúc lệnh" sẽ thay đổi từ chỉ Enterđến Enter, yes, Enter- bạn sẽ được gõ nó như một toàn thể, thậm chí không cố gắng dành chút thời gian vào xác minh rằng bạn thực sự muốn lệnh này để thực thi. Điều này là phản tác dụng và sẽ không giúp bạn.
Allow? 1) yes 2) no #?
không phải yes
cũng không no
hoạt động gây ra vòng lặp vô hạn (Debian 8)
help select
: bạn phải nhập 1
hoặc 2
hơn yes
hoặc no
. Thử lại tự động cho các đầu vào không hợp lệ là hành vi dự định (để người viết kịch bản không phải tự sáng tạo lại while
, giữ lại sự rõ ràng và rõ ràng) và đầu vào EOF chấm dứt vòng lặp. Biết được điều đó, bạn có thể tự kiểm tra xem đoạn script trên có hoạt động không. Tôi sẽ không sửa đổi nó, vì dù sao đó cũng là một bằng chứng thô thiển về khái niệm.
y e s Enter
ví dụ của bạn
cd
vàls
?