Получение кода состояния при использовании конвейеров

Я запускаю следующую команду в bash-скрипте:

cd SomeDir && (sh -c "$CMD_STR") 2>&1 | some_filtering | sed -u -e ....

Т.е. Я запускаю CMD_STR в SomeDir (на самом деле CMD_STR - это «make» или «make target»), выполняю некоторую фильтрацию на выходе CMD_STR, а затем заменяю некоторые символы на «sed».

Мне нужно получить код состояния CMD_STR на случай, если CMD_STR не сможет вернуть его из моего скрипта. Как я могу это сделать?

2
задан 14.04.2020, 20:53

2 ответа

Чтобы проверить код состояния последнего выхода в оболочке bash, вы можете использовать:

echo $?

Также вы сказали, что используете эту команду в скрипте, поэтому, чтобы получить код состояния, вы можете запустить этот скрипт следующим образом:

sh -x /path/to/script

или

bash -x /path/to/script

Другие варианты - использовать команды set -x и set +x в сценарии для получения кода состояния для частей сценария. [1110 ]

Подробнее о:

0
ответ дан 14.04.2020, 20:54

Решение - установить параметр pipefail перед запуском команды.

http://www.gnu.org/software/bash/manual/bashref.html

Если включен pipefail, состояние возврата конвейера равно последняя (самая правая) команда для выхода с ненулевым статусом или ноль, если все команды завершаются успешно.

Итак, теперь мой скрипт выглядит следующим образом:

set -o pipefail
cd SomeDir && (sh -c "$CMD_STR") 2>&1 | some_filtering | sed -u -e ....
exit $?
0
ответ дан 14.04.2020, 20:54

Теги

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