EOFが発生したときに出口1を「読む」目的は何ですか?

EOFが発生したときに出口1を「読む」目的は何ですか?

Bashのマニュアルページには、組み込み機能について次のように記載されていますread

ファイルの終わりが発生しない限り、終了ステータスは0です。

-eオプションを設定して次のコードを使用したので、最近これが私を悩ませました。

read -rd '' json <<EOF
{
    "foo":"bar"
}
EOF

この場合、失敗したシャットダウンが必要な理由を理解できません。これはどのような状況で役に立ちますか?

ベストアンサー1

readレコードを読み取り(デフォルトは減りますが、ksh93 / bash / zshは-dzsh / bashを使用するときにNULも含む他の区切り文字を受け入れます)、レコード全体を読み取る限り成功を返します。

readEOF が見つかったがまだレコード区切り文字に出会っていない場合は、ゼロ以外の値を返します。

これにより、次のことができます。

while IFS= read -r line; do
  ...
done < text-file

またはzsh / bashを使用してください

while IFS= read -rd '' nul_delimited_record; do
  ...
done < null-delimited-list

最後のレコードを読んだ後、ループは終了します。

以下を使用して、最後に完了した履歴以降にさらに多くの[ -n "$nul_delimited_record" ]データがあることを確認できます。

お客様の場合はreadNUL 文字が含まれていないため、入力にレコードは含まれません。bashこの文書にはNULを含めることはできません。したがって、readレコード全体が正常に読み取られなかったため、失敗します。jsonEOF(IFS処理後)まで読み取った内容を変数に保存し続けます。

とにかくread設定せずに使用することはほとんど意味がありません$IFS

詳細については、次を参照してください。「IFS=read-r-line」を理解する

おすすめ記事