Как получить код возврата процесса из конвейера в этом же конвейере?
Пусть есть конвейер (пайп)
false | true | echo ${PIPESTATUS[0]}
Я расчитывал получить 1 как код возврата false, но получаю код возврата команды, выполненой до этого конвейера, т.к. его PIPESTATUS еще не сформирован, насколько я понял.
Возможно ли прямо в текущем конвейере оперировать кодами возврата других его команд?
Изначальная цель - для раскрашивания вывода на основе кода возврата предыдущей команды. Можно сделать через хранение вывода во временном файле, но интересует возможнсь через конвейер.
echo -e "foo\nbar" | awk -v EXIT_CODE=$? '{ if(EXIT_CODE != 0) { VRB="\033[0;31m"; } else { VRB="\033[0;32m"; } print VRB $0 "\033[0m"; }'
Ответы (1 шт):
Автор решения: magrif
→ Ссылка
Такое решение придумал
#!/bin/bash
set -e
function dummy {
echo -e "Random\ntext!!!" "$@"
return $(($RANDOM % 2))
}
function colored_output {
TMPF=`mktemp /tmp/.file$$XXXXXXXXXXXXXXX`
TMP=`"$@" >"$TMPF" 2>&1 && echo 0 || echo 1`
awk -v EXIT_CODE=$TMP '{ if(EXIT_CODE != 0) { VRB="\033[0;31m"; } else { VRB="\033[0;32m"; } print VRB $0 "\033[0m"; }' $TMPF
rm $TMPF
if [ $TMP == 1 ]; then
! echo $- | grep -q e
fi
}
echo FOOTEXT > /tmp/f\\noo
colored_output cat /tmp/f\\noo
rm /tmp/f\\noo
colored_output dummy "\n" Foo "\n" Bar "\n" Baz
echo OK