Jeśli używam trap
jak opisano np. Na http://linuxcommand.org/wss0160.php#trap, aby złapać ctrl-c (lub podobny) i oczyścić przed wyjściem, zmieniam zwrócony kod wyjścia.
Teraz prawdopodobnie nie będzie to miało znaczenia w świecie rzeczywistym (np. Ponieważ kody wyjścia nie są przenośne, a ponadto nie zawsze są jednoznaczne, jak omówiono w Domyślnym kodzie wyjścia po zakończeniu procesu? ), Ale wciąż zastanawiam się, czy istnieje naprawdę nie ma sposobu, aby temu zapobiec i zamiast tego zwrócić domyślny kod błędu dla przerwanych skryptów?
Przykład (w bash, ale moje pytanie nie powinno być uważane za specyficzne dla bash):
#!/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. ' _
Wynik:
$ ./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
(Edytowane, aby usunąć, aby było bardziej zgodne z POSIX).
(Ponownie edytowane, aby uczynić go skryptem bash, moje pytanie nie jest jednak specyficzne dla powłoki).
Zmodyfikowano, aby używać przenośnego „INT” jako pułapki na rzecz nieprzenośnego „SIGINT”.
Edytowane, aby usunąć bezużyteczne nawiasy klamrowe i dodać potencjalne rozwiązanie.
Aktualizacja:
Rozwiązałem to teraz, po prostu wychodząc z kodami błędów na stałe i zatrzymując EXIT. Może to być problematyczne w niektórych systemach, ponieważ kod błędu może się różnić lub pułapka EXIT nie jest możliwa, ale w moim przypadku jest wystarczająca.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
czyta dane wejściowe z bieżącego koprocesu.
read
czytać z bieżącego koprocesu itrap cmd SIGINT
nie będzie działał, ponieważ standard mówi, że powinieneś używaćtrap cmd INT
.