1

パイプの失敗をシミュレートしたいので、1秒ほどでそれを殺すトラップが必要だと思いますか?

#!/bin/bash

set -u
set -o pipefail

cat /dev/zero | cat | cat

しかし、そのようなトラップはどのように実装されていますか?

4

3 に答える 3

3

次のようなことができます:

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

grepin between は終了コードを返す(1失敗する) ため、 afterpipefailが設定されると、全体の終了コードは になり1ます。パイプpipefail内のコマンドの最後のゼロ以外の終了コードを返すことになっているため、機能しています。

于 2013-10-01T10:25:54.040 に答える
1

しかし、そのようなトラップはどのように実装されていますか?

のsigspecはどうあるべきか疑問に思っているようですtrap

が有効な場合pipefail、パイプラインの戻りステータスは、最後 (一番右) のコマンドがゼロ以外のステータスで終了するか、すべてのコマンドが正常に終了した場合はゼロになります。

トラップしたいERR

例:

set -u
set -o pipefail

trap 'echo pipefail' ERR

false | true
于 2013-10-01T10:38:22.453 に答える
0

pipefail をシミュレートするには、パイプライン内のプロセスの 1 つがゼロ以外の値で終了する必要があります (これは通常、何らかの障害を意味します)。パイプラインの詳細はい、SIGKILL または SIGINT シグナルをプロセスに送信すると、少なくとも Linux ではゼロより大きい終了コードが生成されます。

于 2013-10-01T10:23:36.630 に答える