Как реализовать 'set -o pipefail' способом POSIX - почти готово, нужна помощь специалиста

Я должен реализовать BASH "set -o pipefail " опция POSIX, чтобы она работала на разных вкусах LINUX / UNIX. Чтобы объяснить немного, эта опция позволяет пользователю проверить успешное выполнение всех переданных команд. С этой опцией эта команда cat app.log | grep 'ОШИБКА' терпит неудачу, если 'кошка' не получается, иначекошка' ошибка подавлена.

Итак, я нашел действительно хорошее решение здесь:http://cfaj.ca/shell/cus-faq-2.html

      run() {
         j=1
         while eval "\${pipestatus_$j+:} false"; do
           unset pipestatus_$j
           j=$(($j+1))
         done
         j=1 com= k=1 l=
         for a; do
           if [ "x$a" = 'x|' ]; then
             com="$com { $l "'3>&-
                         echo "pipestatus_'$j'=$?" >&3
                       } 4>&- |'
             j=$(($j+1)) l=
           else
             l="$l \"\$k\""
           fi
           k=$(($k+1))
         done
         com="$com $l"' 3>&- >&4 4>&-
                    echo "pipestatus_'$j'=$?"'
         exec 4>&1
         eval "$(exec 3>&1; eval "$com")"
         exec 4>&-
         j=1
         while eval "\${pipestatus_$j+:} false"; do
           eval "[ \$pipestatus_$j -eq 0 ]" || return 1
           j=$(($j+1))
         done
         return 0
       }

Вышеупомянутая функция run () позволяет пользователю вызывать переданные по конвейеру команды таким образом: runcmd1 \| cmd2 \| cmd3 Если одна из команд терпит неудачу, вы получаете ее в $?

Однако существует проблема: он не поддерживает группирование команд между каналами. Я хочу иметь возможность вызывать что-то вроде этого:

run echo "test" ; grep "test" \| awk '{print}'

Когда я делаю это, вызов не удается. Я не могу получить правильную модификацию для поддержки группировки команд - сценарий слишком сложен для моих навыков bash ... Может кто-нибудь помочь?

Спасибо!

Существует определение функции run (), которая позволяет пользователю запускать конвейерные команды следующим образом:

Ответы на вопрос(3)

Ваш ответ на вопрос