el script no finaliza después de presionar ctrl + c

el script no finaliza después de presionar ctrl + c

Tengo un menú de selección con 4 opciones. Quiero que en caso de presionar ctrl + c, elimine algunos archivos antes de finalizar el programa. Aquí está mi 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

pero cuando ejecuto este código y presiono ctrl + c, no sucede nada y el programa no finaliza, simplemente ^cse escribe. ¿Qué ocurre?

Respuesta1

Ctrl+ Cenvía la señal SIGINT, pero la estás capturando y asignándola a tu ctrl_cfunción:

trap ctrl_c INT

Entonces, cuando presione Ctrl+ C, su secuencia de comandos ejecutará la función en lugar de salir. Si eso no es lo que desea, elimine el trapcomando.

Si su objetivo es ejecutar la ctrl_cfunción y luego salir, debe indicarle a su script que salga explícitamente:

ctrl_c() {
     test -f directory/file.txt && rm directory/file.txt
     exit
}

Cuando captura una señal, depende de usted implementar lo que desea que haga su programa en respuesta a esa señal.

Sin embargo, esto no funcionará como se esperaba a menos que la posixopción Shell esté activa ( set -o posix), ya que las señales no se entregan mientras un comando se está ejecutando activamente (consulte "Bash ignora la trampa SIGINT cuando se ejecuta el bucle 'select'").

Esto significa que es posible que desee utilizar set -o posixantes de llamar select(y posiblemente set +o posixdespués).

información relacionada