Wenn ich trap
wie auf http://linuxcommand.org/wss0160.php#trap beschrieben verwende , um Strg-C (oder ähnliches) abzufangen und vor dem Beenden zu bereinigen, ändere ich den zurückgegebenen Exit-Code.
Jetzt wird dies in der realen Welt wahrscheinlich keinen Unterschied machen (z. B. weil die Exit-Codes nicht portierbar sind und darüber hinaus nicht immer eindeutig sind, wie unter Standard-Exit-Code beschrieben, wenn der Prozess beendet wird? ), Aber ich frage mich immer noch, ob es welche gibt Wirklich keine Möglichkeit, dies zu verhindern und stattdessen den Standardfehlercode für unterbrochene Skripte zurückzugeben?
Beispiel (in Bash, aber meine Frage sollte nicht als Bash-spezifisch angesehen werden):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Ausgabe:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Bearbeitet, um es zu entfernen, um es POSIX-konformer zu machen.)
(Erneut bearbeitet, um es stattdessen zu einem Bash-Skript zu machen, ist meine Frage jedoch nicht Shell-spezifisch.)
Bearbeitet, um das tragbare "INT" für die Falle zugunsten des nicht tragbaren "SIGINT" zu verwenden.
Bearbeitet, um nutzlose geschweifte Klammern zu entfernen und mögliche Lösungen hinzuzufügen.
Aktualisieren:
Ich habe es jetzt gelöst, indem ich einfach mit einigen fest codierten Fehlercodes beendet und EXIT abgefangen habe. Dies kann auf bestimmten Systemen problematisch sein, da der Fehlercode möglicherweise abweicht oder der EXIT-Trap nicht möglich ist. In meinem Fall ist dies jedoch in Ordnung.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
Eingaben aus dem aktuellen Coprozess gelesen werden.
read
, dass Sie aus dem aktuellen Coprozess lesen sollen, undtrap cmd SIGINT
funktionieren nicht, wie es der Standard vorschreibttrap cmd INT
.