У меня есть меню выбора с 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
и после).