Если вам нужно уметь ловить ошибки и применять определенное поведение, ловушка может стать вашим другом.Этот код печатает сам, поэтому я просто публикую здесь прогон:
$: 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
.