リダイレクト演算子を使用してstdinをwhileループに送信する方法

リダイレクト演算子を使用してstdinをwhileループに送信する方法

タイトルに正しい単語を使用しているかどうかはわかりません。以下を試しています。

while read line; do
    echo "$line"
    exit;
done;  <( echo "foo\n"; exit )

whileしかし、動作が停止します。ループがプロセスから入力を受け取らないようですecho。これを行う正しい方法と、これが間違った理由を知っている人はいますか?

私はこれを行うことができます:

echo "foo" | while read line; do echo "$line"; done;

しかし、私は学習目的のためだけに最初の方法を選びたいと思います。プロセスの交換が必要かどうかはわかりません。

答え1

ループ後もスクリプトが続きます${line}

セミコロンを削除し、doneプロセス置換の間に入力リダイレクトを入れます。

done < <( echo "foo\n"; exit )

exitプロセス交換の実行を明示的に終了する必要はありません。

ただし、テキストファイル処理の場合は通常、またはをsed使用する方が良いと安全でありawk、これはより良いパフォーマンスを提供します。テキスト行を処理するために本当にBashを使用する必要がある場合は、通常非常に次のことをお勧めします。(ループの最初の行のみが表示されます)

while IFS= read -r line ; do

あなたが本当に他のものが必要であることを知らない限り。

これは、Bashで区切り文字とエスケープ文字を使用して解析、圧縮、および解釈される空白、改行、およびバックスラッシュを含む入力行の生の処理に必要です。

関連情報