#!/bin/sh
echo "hello world" | read var1 var2
echo $var1
echo $var2
パイプラインは各コンポーネントをサブシェル内で実行するため、出力は生成されません。サブシェルは、親シェルの変数を共有するのではなく、それらのコピーを継承します。これを試して:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
(
echo $foo
foo="foo contents modified"
echo $foo
)
echo $foo
括弧は、サブシェルで実行されるコードの領域を定義し、$foo はその内部で変更された後も元の値を保持します。
これを試してください:
#!/bin/sh
foo="contents of shell variable foo"
echo $foo
{
echo $foo
foo="foo contents modified"
echo $foo
}
echo $foo
中括弧は純粋にグループ化のためのものであり、サブシェルは作成されません。中括弧内で変更された $foo は、それらの外で変更された $foo と同じです。
これを試してください:
#!/bin/sh
echo "hello world" | {
read var1 var2
echo $var1
echo $var2
}
echo $var1
echo $var2
中括弧内では、read ビルトインが $var1 と $var2 を適切に作成し、それらがエコーされていることがわかります。中括弧の外では、それらはもう存在しません。中括弧内のすべてのコードは、パイプラインの 1 つのコンポーネントであるため、サブシェルで実行されています。
中かっこの間に任意の量のコードを配置できるため、他の何かの出力を解析するシェル スクリプトのブロックを実行する必要があるときはいつでも、このブロックへのパイピング構造を使用できます。