我有一个有 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
}
当您捕获信号时,您可以根据自己的需要来实现您希望程序执行的操作来响应该信号。
posix
然而,除非shell 选项处于活动状态 ( ) ,否则这不会按预期工作,set -o posix
因为在命令主动执行时不会传递信号(请参阅“当“select”循环运行时,Bash 忽略 SIGINT 陷阱”)。
这意味着您可能希望set -o posix
在调用之前select
(也可能set +o posix
在调用之后)使用。