
シェルスクリプト
#!/bin/bash
set -euo pipefail
for i in {1..1000}; do
head -c 10000 /dev/urandom | tr -dc '0-1' | head -0 \
&& echo -n . \
|| { echo -e "\nNum $i, Unknown error!"; break; }
sleep 0.1
done
説明する
- 唯一のキーコマンドは
head -c 10000 /dev/urandom | tr -dc '0-1' | head -0
- このスクリプトは数秒後にクラッシュします。
....................................... Num 40, Unknown error!
質問
- このスクリプトが中断されるのはなぜですか?
答え1
まず、プロセスの終了コードを取得するには、$?
エラーレポートを次のように置き換えます。
echo -e "\nNum $i, error: $?"; break;
これは、スクリプトの終了時にプログラムがコード141で終了することを示します。
この回答コード141は、プロセスが終了したことを示しますSIGPIPE
。
ゼロ行を読み取るように要求したため、前のプログラムが出力head
ストリームに何かを書き込む前にプログラムが終了し、エラーが発生する可能性があります。
この問題を解決する 1 つの方法は、最終ヘッダーを少し遅らせることです。
set -euo pipefail
for i in {1..1000}; do
if head -c 10000 /dev/urandom | tr -dc '0-1' | (sleep 0 && head -0) ; then
echo -n .
else
echo -e "\nNum $i, error: $?"; break;
fi
sleep 0.1
done