標準入力から「読み取り」を読むにはどうすればよいですか? [コピー]

標準入力から「読み取り」を読むにはどうすればよいですか? [コピー]

read bashの組み込み機能はstdinの入力を受け入れるというのですが、次のコマンドはなぜ何も読めないのでしょうか?

$ printf "%s" "a   b" | read line
$ printf "%s" "$line"
$

ありがとうございます。

ベストアンサー1

問題はreadそれ自体ではなくパイプラインです。 Bashでは、2番目のコマンド(readこの場合)はサブシェルで実行されます。したがって、実際には変数に入り、readそのline変数だけがサブシェルに存在し、パイプが完了すると消えます。

(他のシェルは異なる動作をします。特にkshは現在のシェルでパイプラインの最後のコマンドを実行するため、このコードスニペットはkshで動作できますが、ご覧のようにbashでは機能しません。)

<(...)考えられる解決策の1つは、パイプの最初の部分にプロセス置換を使用し、さらに<標準入力にリダイレクトすることです。

read line < <(printf "%s" "a   b")

この特別な場合は、コマンドなしで実行でき、printf機能<<<します。

read line <<<"a   b"

おすすめ記事