скрипт не завершается после нажатия 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активна опция оболочки ( set -o posix), поскольку сигналы не доставляются во время активного выполнения команды (см. "Bash игнорирует ловушку SIGINT при выполнении цикла «select»").

Это означает, что вы можете захотеть использовать его set -o posixперед звонком select(а затем, возможно, set +o posixи после).

Связанный контент