В Баше вы могли бы сделать:
echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
Пример:
$ ls -l | grep somefile
-rw-rw-r-- 1 me me 32 May 4 15:47 somefile
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
0 0
$ ls -l 1>/dev/null | grep while
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
0 1
Для водопроводных процессов переднего плана
В случае сценария говорит testscript.sh, который содержит:
#!/bin/bash
echo "Some Stuff"
exit 29 # Some random exit code for testing
сделать
$./testscript.sh | grep somestuff
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
29 1
Для централизованному фоновых процессов
Метод 1: Использование pipefail
Для testscript.sh, который содержит:
#!/bin/bash
set -eo pipefail
#set -o pipefail causes a pipeline to produce a failure return code
#If a command fails, set -e will make the whole script exit,
cat nonexistingfile # this command fails
echo "Some Stuff"
exit 29
ли
$ ./testscript.sh 2>/dev/null | grep Some &
[2] 7684
$ fg 2
bash: fg: job has terminated
[2]- Exit 1 ./testscript.sh 2> /dev/null | grep --color=auto Some
Вы получаете статус выхода 1, из которого вы заключаете, что сбой сценария.
Если бы cat nonexistingfile
был удален, вы бы получили:
[2]- Done ./37257668.sh 2> /dev/null | grep --color=auto Some
Disdvantage: pipefail возвращает один для всех выхода кода, который не относится к команде, что не удалось
метод 2: Источник сценария оболочки
$ . ./testscript.sh 2>/dev/null | grep Some & #mind the dot in the beginning
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
29 0
Финальный штрих
Если вы подозреваете одну команду, чтобы потерпеть неудачу в сценарий оболочки, тестовый скрипт, вы можете сделать ниже:
#no shebang
echo "Some Stuff"
ls non_existent 2>/dev/null || ls__return_value=50
ли
$. ./testscript | grep "Some"
$if [ $ls__return_value -eq 50 ]; then echo "Error in ls"; fi
Показать, каким образом ' wait' не работает. –