12

set -o pipefailさまざまなLINUX/UNIXフレーバーで機能するように、BASHオプションをPOSIXの方法で実装する必要があります。少し説明すると、このオプションを使用すると、ユーザーはパイプされたすべてのコマンドが正常に実行されたことを確認できます。このオプションを有効にすると、失敗したcat app.log | grep 'ERROR'場合にこのコマンドは失敗catします。それ以外の場合、catエラーは抑制されます。

だから、私はここで本当に素晴らしい解決策を見つけました: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()関数を使用すると、ユーザーは次のような方法でパイプコマンドを呼び出すことができます。

run cmd1 \| cmd2 \| cmd3

コマンドの1つが失敗した場合は、$?

問題がありますが、パイプ間のコマンドのグループ化はサポートされていません。次のようなものを呼び出せるようにしたいと思います。

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

私がそれをするとき、呼び出しは失敗します。コマンドのグループ化をサポートするための適切な変更を取得できません-スクリプトは私のbashスキルには少し複雑すぎます...

誰か助けてもらえますか?

ありがとう!

4

3 に答える 3