das Skript wird nach dem Drücken von Strg + C nicht beendet

das Skript wird nach dem Drücken von Strg + C nicht beendet

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 ^cwird nur etwas eingegeben. Was ist falsch?

Antwort1

Ctrl+ Csendet das SIGINT-Signal, aber Sie erfassen es und weisen es Ihrer ctrl_cFunktion 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 trapBefehl.

Wenn Ihr Ziel darin besteht, die Funktion auszuführen ctrl_cund 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 posixShell-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 posixDies bedeutet, dass Sie es möglicherweise vor dem Anrufen select(und dann möglicherweise danach) verwenden möchten set +o posix.

verwandte Informationen