パイプの失敗をシミュレートしたいので、1秒ほどでそれを殺すトラップが必要だと思いますか?
#!/bin/bash
set -u
set -o pipefail
cat /dev/zero | cat | cat
しかし、そのようなトラップはどのように実装されていますか?
次のようなことができます:
echo "a" | grep "b" | sed 's/a/c/g'
echo $?
set -o pipefail
echo "a" | grep "b" | sed 's/a/c/g'
echo $?
それは印刷します:
0
1
grep
in between は終了コードを返す(1
失敗する) ため、 afterpipefail
が設定されると、全体の終了コードは になり1
ます。パイプpipefail
内のコマンドの最後のゼロ以外の終了コードを返すことになっているため、機能しています。
しかし、そのようなトラップはどのように実装されていますか?
のsigspecはどうあるべきか疑問に思っているようですtrap
。
が有効な場合
pipefail
、パイプラインの戻りステータスは、最後 (一番右) のコマンドがゼロ以外のステータスで終了するか、すべてのコマンドが正常に終了した場合はゼロになります。
トラップしたいERR
。
例:
set -u
set -o pipefail
trap 'echo pipefail' ERR
false | true
pipefail をシミュレートするには、パイプライン内のプロセスの 1 つがゼロ以外の値で終了する必要があります (これは通常、何らかの障害を意味します)。パイプラインの詳細。はい、SIGKILL または SIGINT シグナルをプロセスに送信すると、少なくとも Linux ではゼロより大きい終了コードが生成されます。