Eu tenho um menu selecionado com 4 opções. Quero que no caso de pressionar ctrl + c, remova alguns arquivos antes de encerrar o programa. Aqui está o meu código:
#!/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
mas quando executo esse código e pressiono ctrl + c, nada acontece e o programa não é finalizado, apenas ^c
é digitado. O que está errado?
Responder1
Ctrl+ Cenvia o sinal SIGINT, mas você o captura e atribui à sua ctrl_c
função:
trap ctrl_c INT
Então, quando você pressionar Ctrl+ C, seu script executará a função em vez de sair. Se não é isso que você deseja, remova o trap
comando.
Se o seu objetivo é executar a ctrl_c
função e depois sair, você precisa informar explicitamente ao seu script para sair:
ctrl_c() {
test -f directory/file.txt && rm directory/file.txt
exit
}
Ao capturar um sinal, cabe a você implementar o que deseja que seu programa faça em resposta a esse sinal.
No entanto, isso não funcionará como esperado, a menos que a posix
opção shell esteja ativa ( set -o posix
), pois os sinais não são entregues enquanto um comando está sendo executado ativamente (consulte "Bash ignorando a armadilha SIGINT quando o loop 'select' está em execução").
Isso significa que você pode querer usar set -o posix
antes de ligar select
(e possivelmente set +o posix
depois).