Захват ненулевого кода выхода из именованного канала - PullRequest
0 голосов
/ 23 ноября 2018

Следующий игрушечный скрипт (tmp.sh) завершается с кодом 0 даже в случае сбоя процесса, отправленного в именованный канал.Как я могу получить ненулевой код выхода из именованного канала?Или, в общем, тот факт, что что-то пошло не так?

#!/bin/bash

set -eo pipefail

mkfifo mypipe
FOOBAR > mypipe &

cat mypipe

Запустите и проверьте код выхода:

bash tmp.sh
tmp.sh: line 6: FOOBAR: command not found

echo $? # <- Exit code is 0 despite the "command not found"!

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вам нужно уметь ловить ошибки и применять определенное поведение, ловушка может стать вашим другом.Этот код печатает сам, поэтому я просто публикую здесь прогон:

$: tst
+ trap 'x=$?; echo "$x@$0:$LINENO"; exit $x' err
+ rm -f mypipe
+ mkfifo mypipe
+ pid=6404
+ cat mypipe
+ cat ./tst
#! /bin/env bash

set -x

trap 'x=$?; echo "$x@$0:$LINENO"; exit $x' err
#set -eo pipefail

rm -f mypipe
mkfifo mypipe

cat $0 >mypipe &
pid=$!
cat mypipe
wait $pid

fubar >mypipe &
pid=$!
cat mypipe
wait $pid

echo done

+ wait 6404
+ pid=7884
+ cat mypipe
+ fubar
./tst: line 16: fubar: command not found
+ wait 7884
++ x=127
++ echo 127@./tst:19
127@./tst:19

Обратите внимание на строку trap 'x=$?; echo "$x@$0:$LINENO"; exit $x' err.Он устанавливает x в последний код ошибки, который будет вызывать его.Затем он печатает код, имя файла и номер строки, которую он в данный момент выполняет (перед прерыванием), и выходит из программы с кодом ошибки.Это на самом деле срабатывает на wait.Это заставляет его освобождаться, прежде чем продолжить эхо внизу.

Работает с или без set -eo pipefail.

0 голосов
/ 23 ноября 2018

Вам необходимо захватить идентификатор процесса фонового процесса и wait, чтобы он установил правильный статус выхода:

#!/bin/bash
set -eo pipefail

rm -f mypipe
mkfifo mypipe

FOOBAR > mypipe &
# store process id of above process into pid
pid=$!

cat mypipe

# wait for background process to complete
wait $pid

Теперь, когда вы запустите его:

bash tmp.sh
tmp.sh: line 6: FOOBAR: command not found
echo $?
127
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...