按 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
}

當您捕獲一個訊號時,您需要實作您希望程式執行的操作來回應該訊號。

然而,除非 shell 選項處於活動狀態,否則這將不會按預期工作posixset -o posix因為在命令主動執行時不會傳遞訊號(請參閱“當「select」迴圈運行時,Bash 忽略 SIGINT 陷阱”)。

這意味著您可能希望set -o posix在調用之前select(也可能set +o posix在調用之後)使用。

相關內容