Как получить код возврата процесса из конвейера в этом же конвейере?

Пусть есть конвейер (пайп)

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
→ Ссылка