Ich habe ein Auswahlmenü mit 4 Optionen. Ich möchte, dass beim Drücken von Strg + C einige Dateien entfernt werden, bevor das Programm beendet wird. Hier ist mein Code:
#!/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
aber wenn ich diesen Code ausführe und Strg + C drücke, passiert nichts und das Programm wird nicht beendet, es ^c
wird nur etwas eingegeben. Was ist falsch?
Antwort1
Ctrl+ Csendet das SIGINT-Signal, aber Sie erfassen es und weisen es Ihrer ctrl_c
Funktion zu:
trap ctrl_c INT
Wenn Sie also Ctrl+ drücken C, führt Ihr Skript die Funktion aus, anstatt sie zu beenden. Wenn Sie das nicht möchten, entfernen Sie den trap
Befehl.
Wenn Ihr Ziel darin besteht, die Funktion auszuführen ctrl_c
und dann zu beenden, müssen Sie Ihrem Skript explizit mitteilen, dass es beendet werden soll:
ctrl_c() {
test -f directory/file.txt && rm directory/file.txt
exit
}
Wenn Sie ein Signal abfangen, liegt es an Ihnen, zu implementieren, was Ihr Programm als Reaktion auf dieses Signal tun soll.
Dies funktioniert jedoch nicht wie erwartet, es sei denn, die posix
Shell-Option ist aktiv ( set -o posix
), da Signale nicht übermittelt werden, während ein Befehl aktiv ausgeführt wird (siehe "Bash ignoriert SIGINT-Trap, wenn die „Select“-Schleife ausgeführt wird").
set -o posix
Dies bedeutet, dass Sie es möglicherweise vor dem Anrufen select
(und dann möglicherweise danach) verwenden möchten set +o posix
.