Реализуется ли статус выхода команды командой или процессом оболочки, который выполняет команду?

Вы можете использовать встроенный readarray bash:

readarray status < <(upsc myups)
3
09.12.2016, 20:29
3 ответа

Процесс определяет свой собственный код выхода. Когда он завершается, он предоставляет код выхода или, если он не указан, предполагается, что он равен нулю (без ошибки).

Как в интерактивной, так и в неинтерактивной оболочке код выхода предыдущей команды можно получить через значение $? .

2
27.01.2020, 21:08

Сама команда может предоставить статус выхода через аргумент системного вызова exit () . Оболочка (или другая программа, как насчет system () в Perl или PHP?) Может получить статус выхода дочернего процесса через wait () или waitpid () системные вызовы. Все ядра Unix / Linux / * BSD доставляют SIGCHLD родительскому процессу, когда дочерний процесс меняет статус.

Но есть и другие обстоятельства. Процесс, завершенный с помощью SIGKILL, не имеет возможности выйти. У процесса, разыменовывающего неверный адрес, не будет возможности вызвать exit () , если у него не установлен обработчик сигнала SIGSEGV. В таких случаях ядро ​​вычисляет статус выхода, который включает бит, который означает «убит сигналом», и какой сигнал вызвал остановку процесса. Этот вычисленный ядром статус выхода доставляется родительскому процессу убитого процесса.

9
27.01.2020, 21:08

Код устанавливает статус выхода

$ 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
$ 
5
27.01.2020, 21:08

Теги

Похожие вопросы