按 ctrl + c 后脚本未终止

按 ctrl + c 后脚本未终止

我有一个有 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在调用之后)使用。

相关内容