o script não é encerrado após pressionar ctrl + c

o script não é encerrado após pressionar ctrl + c

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_cfunçã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 trapcomando.

Se o seu objetivo é executar a ctrl_cfunçã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 posixopçã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 posixantes de ligar select(e possivelmente set +o posixdepois).

informação relacionada