このコマンドを実行すると:
$echo -n "こんにちは"
こんにちは$
上記の出力を取得します。これは、echo -nが改行を終了せずに文字列を印刷することを意味します。
これでパイプを介して出力を読み込みます。ここで、readコマンドは改行文字が表示されるまで読み続ける必要があります。
$echo -n "こんにちは" |読む
$
上記のコマンドを実行すると、コマンドプロンプトに戻ります。ただし、上記のコマンドは改行文字に会わないため、入力を待っている間は継続的に中断されることが予想されます。なぜこれが起こらないのですか?
答え1
そのパイプラインの終了ステータスを調べると、read
1が返されることがわかります。
$ 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
も空であることを確認します。