我有一個有 4 個選項的選擇選單。我希望在按 ctrl + c 的情況下,在終止程式之前刪除一些檔案。這是我的程式碼:
#!/bin/bash
ctrl_c() {
test -f directory/file.txt && rm directory/file.txt
}
trap ctrl_c INT
PS3='Please enter your choice: '
while true; do
clear
options=("Option 1" "Option 2" "Option 3" "Exit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice $REPLY which is $opt"
break
;;
"Option 2")
echo "you chose choice $REPLY which is $opt"
break
;;
"Option 3")
echo "you chose choice $REPLY which is $opt"
break
;;
"Exit")
break 2
;;
*) echo "invalid option $REPLY";;
esac
done
read -p "Press [Enter] key to continue..."
done
但是當我運行此程式碼並按 ctrl + c 時,沒有任何反應,並且程式沒有終止,只是^c
輸入了內容。怎麼了?
答案1
Ctrl+C發送 SIGINT 訊號,但您正在捕獲該訊號並將其分配給您的ctrl_c
函數:
trap ctrl_c INT
因此,當您按Ctrl+時C,您的腳本將執行該函數而不是退出。如果這不是您想要的,請刪除該trap
命令。
如果您的目標是執行ctrl_c
函數然後退出,您需要告訴腳本明確退出:
ctrl_c() {
test -f directory/file.txt && rm directory/file.txt
exit
}
當您捕獲一個訊號時,您需要實作您希望程式執行的操作來回應該訊號。
然而,除非 shell 選項處於活動狀態,否則這將不會按預期工作posix
(set -o posix
因為在命令主動執行時不會傳遞訊號(請參閱“當「select」迴圈運行時,Bash 忽略 SIGINT 陷阱”)。
這意味著您可能希望set -o posix
在調用之前select
(也可能set +o posix
在調用之後)使用。