Якщо я використовую, trap
як описано, наприклад, на http://linuxcommand.org/wss0160.php#trap, щоб увімкнути ctrl-c (або подібне) та очищення перед виходом, тоді я змінюю код повернення, який повертається.
Тепер це, мабуть, не матиме значення в реальному світі (наприклад, через те, що коди виходу не є портативними, і, крім того, не завжди однозначним, як обговорювалося в коді виходу за замовчуванням, коли процес закінчується? ), Але все одно мені цікаво, чи є насправді жодним чином не запобігти цьому і повернути код помилки за замовчуванням для перерваних сценаріїв замість цього?
Приклад (in bash, але моє питання не слід вважати специфічним для 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. ' _
Вихід:
$ ./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
(Відредаговано для видалення, щоб зробити його більш сумісним з POSIX.)
(Знову відредаговано, щоб зробити це сценарієм bash, моє запитання не стосується оболонки.)
Відредаговано для використання портативного "INT" для пастки на користь непортативного "SIGINT".
Відредаговано, щоб видалити непотрібні фігурні брекети та додати потенційне рішення.
Оновлення:
Я вирішив це зараз, просто вийшовши з деякими кодами помилок, жорстко закодованим і захопивши EXIT. Це може бути проблематично в певних системах, оскільки код помилки може відрізнятись або пастка EXIT неможлива, але в моєму випадку це все в порядку.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
читає дані з поточного копроцесу.
read
читати з поточного копроцесу іtrap cmd SIGINT
не буде працювати, як стандарт говорить, що ви повинні використовуватиtrap cmd INT
.