Поймать код выхода в выводе bash-скрипта на экран и войти

Я пытаюсь объединить две строки, которые работают отдельно, но я не могу заставить их работать вместе. Для захвата и выхода из кода 1:

Python script.py > /logfile.log 2>&1
ret=$?
if [ $ret -ne 0 ]; then
     exit $ret
fi

Чтобы вывести результат скрипта на экран и в файл журнала:

Python script.py 2>&1 | tee /logfile.log 

Я хочу объединить эти 2 команды, чтобы скрипт выводил на экран и в файл журнала, а также ловил код выхода 1, чтобы прервать выполнение сценария в случае его сбоя. Я пытался комбинировать их по-разному, но скрипт либо продолжает работать, либо ничего не выводится на экран. Можно ли это сделать?

1 ответ

Решение

Используйте массив PIPESTATUS:

Python script.py 2>&1 | tee /logfile.log
ret="${PIPESTATUS[0]}"
if [[ "$ret" -ne "0" ]]; then
  exit "$ret"
fi

Из man bash:

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

Другие вопросы по тегам