改行を使用しないにもかかわらず、パイピング中に入力を終了するには?

改行を使用しないにもかかわらず、パイピング中に入力を終了するには?

このコマンドを実行すると:

$echo -n "こんにちは"

こんにちは$

上記の出力を取得します。これは、echo -nが改行を終了せずに文字列を印刷することを意味します。

これでパイプを介して出力を読み込みます。ここで、readコマンドは改行文字が表示されるまで読み続ける必要があります。

$echo -n "こんにちは" |読む

$

上記のコマンドを実行すると、コマンドプロンプトに戻ります。ただし、上記のコマンドは改行文字に会わないため、入力を待っている間は継続的に中断されることが予想されます。なぜこれが起こらないのですか?

答え1

そのパイプラインの終了ステータスを調べると、read1が返されることがわかります。

$ echo -n "Hello" | read
$ echo $?
1

ファイル終了条件が発生し、データが読み取れなくなったため、1 を返します。入力ストリームは操作を完了して終了し、パイプの対応する側面を閉じてecho閉じます。echo

入力ストリームが閉じられる前に読み取られたデータechoは、変数で引き続き使用できますREPLY

$ echo -n "Hello" | { read; echo "$REPLY"; }
Hello

つまり、read入力ストリームが閉じられていることを知っているので、追加の入力を待ちません。

また(接線的に)関連:「パイプを開けておく」とはどういう意味ですか?


次のようなループが発生する可能性があります。

while read variable || [ -n "$variable" ]; do
    # something with "$variable"
done

これにより、最終改行文字で適切に終了できない可能性がある入力を読み取ることができます。テストがなく、-nデータに最後の改行文字がない場合は、最後の行(終了しない行)をスキップします。

このループで使用されるユーティリティはreadテストと同じです。ループが接続されている入力ストリームが閉じると(readファイルの終わりを過ぎて読み取られる)、ゼロ以外のread終了状態が返され、ループが終了します。テストの結果-n実際にはい1回の追加反復しかし、追加の反復は、はい、読み取るデータがなくなり、値$variableも空であることを確認します。

関連情報