1

Всякий раз, когда выходные данные команды передаются другому в bash, какая команда будет иметь значение выхода ($? переменная) будет возвращена из? Команда, из которой был передан вывод, или команда, в которую был передан вывод?

Скажем, например, в команде:

git diff | vim -

Будет ли $? переменная приходит из команды git diff или команды vim - ?

3 ответа3

5

Последняя команда в трубе.

$ false | echo -n
$ echo $?
0

$ true | echo -n
$ echo $?
0

$ true | echo -n | false
$ echo $?
1
5

man bash говорит:

   ?      Expands to the exit status of the most recently  executed  fore‐
          ground pipeline.

А также:

   The return status of a pipeline is the exit status of the last command,
   unless the pipefail option is enabled.
1

$? сохраняет состояние последней выполненной команды в конвейере, но если вы хотите проверить состояние команды внутри конвейера, используйте переменную PIPESTATUS , которая

Переменная массива (см. Массивы), содержащая список значений состояния выхода из процессов в самом последнем выполняемом конвейере переднего плана (который может содержать только одну команду).

В вашем примере статус возврата git diff можно прочитать из ${PIPESTATUS[0]} .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .