Вы можете использовать встроенный readarray
bash:
readarray status < <(upsc myups)
Процесс определяет свой собственный код выхода. Когда он завершается, он предоставляет код выхода или, если он не указан, предполагается, что он равен нулю (без ошибки).
Как в интерактивной, так и в неинтерактивной оболочке код выхода предыдущей команды можно получить через значение $?
.
Сама команда может предоставить статус выхода через аргумент системного вызова exit ()
. Оболочка (или другая программа, как насчет system ()
в Perl или PHP?) Может получить статус выхода дочернего процесса через wait ()
или waitpid ()
системные вызовы. Все ядра Unix / Linux / * BSD доставляют SIGCHLD родительскому процессу, когда дочерний процесс меняет статус.
Но есть и другие обстоятельства. Процесс, завершенный с помощью SIGKILL, не имеет возможности выйти. У процесса, разыменовывающего неверный адрес, не будет возможности вызвать exit ()
, если у него не установлен обработчик сигнала SIGSEGV. В таких случаях ядро вычисляет статус выхода, который включает бит, который означает «убит сигналом», и какой сигнал вызвал остановку процесса. Этот вычисленный ядром статус выхода доставляется родительскому процессу убитого процесса.
Код устанавливает статус выхода
$ perl -e 'END { $? = 42 }'; echo $?
42
$
, за исключением случаев, когда он не
$ perl -e 'sleep 999; END { $? = 42 }'
^C
$ echo $?
130
$ echo $((130-128))
2
$ kill -l | head -2
1 HUP Hangup 17 STOP Stopped (signal)
2 INT Interrupt 18 TSTP Stopped
$
, либо
$ perl -e '$SIG{INT}=sub{exit 7};sleep 999'
^C$ echo $?
7
$
, либо не используется, если кто-то будет шустрее с SIGKILL
и т. Д.
В противном случае документация bash
вводит в заблуждение, поскольку waitpid
устанавливает 16-битное слово состояния, но bash
передает только подмножество этого слова в переменной оболочки $?
. Это может привести к неведению и путанице, если пользователь оболочки попытается обработать результаты waitpid
, как если бы это было 8-битное значение (это не так).
$ false; echo $?
1
$ perl -E 'system("false"); say $?'
256
$ perl -E 'system("false"); say $? >> 8'
1
$