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スキルには少し複雑すぎます...
誰か助けてもらえますか?
ありがとう!