読み取りコマンドがエコーとパイプで機能しないのはなぜですか? [コピー]

読み取りコマンドがエコーとパイプで機能しないのはなぜですか? [コピー]

次のコマンドに関して:

$ unset a
$ echo 12 | read a
$ echo $a

$

2番目のステートメントでは、aの値が12に設定されることを期待しています。しかし、aはまだ設定されていないことがわかりました。

ベストアンサー1

Bashでプロセス置換を使用できます。

read -r a < <(echo 12)
echo "$a"

またはhere stringbashでも可能です。

read -r a <<< 12
echo "$a"

ほとんどのシェルでは、パイプラインの各コマンドは別々のSubShellで実行されます。バラよりパイプを介してデータを読み取れないのはなぜですか?

使用しているシェルがプロセスの置き換えをサポートしていない場合は、一時ファイルを使用する必要があります。here string

echo 12 > tempfile
read -r a < tempfile
echo "$a"

一時ファイルは実際のスクリプトの例にすぎませんが、一時ファイルは安全な方法でfifo使用されます。mktemp

おすすめ記事