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"