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 ^c
se escribe. ¿Qué ocurre?
Respuesta1
Ctrl+ Cenvía la señal SIGINT, pero la estás capturando y asignándola a tu ctrl_c
funció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 trap
comando.
Si su objetivo es ejecutar la ctrl_c
funció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 posix
opció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 posix
antes de llamar select
(y posiblemente set +o posix
después).