2016-05-16 2 views
0
someCommand 2>&1 | grep pattern & 

Как получить статус выхода someCommand?Получить код выхода из процесса подачи в трубку

PIPESTATUS не работает (или я не знаю, как его использовать), потому что это фоновый процесс.

Я нашел это link и, похоже, работает, но только если я использую его именно так. Простой echo На экране не работает. Мне было интересно, можно ли получить код выхода без создания временных файлов.

+0

Показать, каким образом ' wait' не работает. –

ответ

4

В Баше вы могли бы сделать:

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 
+0

Вы прочитали мой вопрос?Я спрашиваю о случае с фоновым процессом, и я также написал, что 'PIPESTATUS' не работает в этом случае. – NPS

+0

@NPS: Обновлено. – sjsam

+0

Как получить код выхода здесь? Если скрипт возвращает '29', он по-прежнему показывает' Done' вместо 'Exit 29' или sth. – NPS