Ссылаясь на решение $?
, приведенное выше: $?
будет отражать код завершения последней выполненной команды.Учтите это:
#!/bin/bash
trap 'echo CODE: $?; exit 1' 1 2 3 15
sleep 3600
Если вы запустите это и нажмете Ctrl-C , будет напечатано CODE: 130
.Это потому, что исполняемый файл sleep
был прерван SIGINT и завершен с этим кодом.
Сравните это с:
#!/bin/bash
trap 'echo CODE: $?; exit 1' 1 2 3 15
read X
Если вы запустите это и нажмете Ctrl-C , он напечатает CODE: 0
, предположительно потому, что команда read
является встроенной, а правила кода выхода отличаются (то же самое происходит, если вы прервете while : ; do : ; done
).
Итак, только $?
сообщает вам о сигнале, если он прервал внешнюю команду, и , если эта конкретная программа не перехватила сигнал и вышла со своим собственным кодом выхода.В этом случае сценарий bash приведен выше: после получения SIGINT он завершится с кодом 1
, а не 130
.