Это уже мой третий тред за неделю с глупыми вопросами по скриптингу.
На этот раз мне нужно получить exit code от command1 в конструкции { command1 2>&3 | command2; } 3>&1 1>&2 | command3
, чтобы вывести сообщение об ошибке и завершить выполнение скрипта.
В первых двух тредах мне не без помощи скрипт-гуру удалось сделать следующее:
sim.sh:
#!/bin/sh
filter() {
local l n
while read -r l; do
n=${l#\[ninja\]}
[ "x$l" != "x$n" ] && printf "%s\n" "$n" || printf "%s\n" "$l" >&2
done
}
cat log | filter
exit 1
test.sh:
#!/bin/sh
set -e
process() {
while read line; do
printf "%s\n" "${line}" >> "std$1.txt"
printf "$2"
done
}
{ ./sim.sh 2>&3 | process out .; } 3>&1 1>&2 | process err x
printf '\nthis should never be printed\n'
log содержит следующие строки, взятые из вывода настоящего ninja:
[ninja][72/154] Building C object src/CMakeFiles/git2internal.dir/oid.c.o [ninja][73/154] Building C object src/CMakeFiles/git2internal.dir/parse.c.o [ninja][74/154] Building C object src/CMakeFiles/git2internal.dir/patch.c.o [ninja][75/154] Building C object src/CMakeFiles/git2internal.dir/pack.c.o ../src/pack.c:790:22: warning: incompatible pointer types assigning to 'mz_alloc_func' (aka 'void *(*)(void *, unsigned long, unsigned long)') from 'void *(void *, unsigned int, unsigned int)' [-Wincompatible-pointer-types] obj->zstream.zalloc = use_git_alloc; ^ ~~~~~~~~~~~~~ ../src/pack.c:868:16: warning: incompatible pointer types assigning to 'mz_alloc_func' (aka 'void *(*)(void *, unsigned long, unsigned long)') from 'void *(void *, unsigned int, unsigned int)' [-Wincompatible-pointer-types] stream.zalloc = use_git_alloc; ^ ~~~~~~~~~~~~~ 2 warnings generated. [ninja][76/154] Building C object src/CMakeFiles/git2internal.dir/posix.c.o [ninja][77/154] Building C object src/CMakeFiles/git2internal.dir/patch_generate.c.o [ninja][78/154] Building C object src/CMakeFiles/git2internal.dir/pqueue.c.o [ninja][79/154] Building C object src/CMakeFiles/git2internal.dir/patch_parse.c.o
К сожалению, скрипт не завершается с ошибкой, а выводить на экран «this should never be printed». Буду благодарен любым подсказкам, как реализовать завершение скрипта при ошибке.