/dev/urandomループの読み取りが失敗するのはなぜですか?

/dev/urandomループの読み取りが失敗するのはなぜですか?

シェルスクリプト

#!/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

おすすめ記事