#!/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
を、組み込みの読み取りが正常に$ VAR1とVAR2 $を作成し、あなたは彼らが反響を受けることがわかります。中括弧の外側には、もう存在しません。中括弧内のすべてのコードはサブファイルで実行されています。これは、パイプラインの1つのコンポーネントであるです。
中括弧の間に任意の量のコードを入れることができるので、何か他のものの出力を解析するシェルスクリプトのブロックを実行する必要があるときはいつでも、このパイピングブロックを使用できます。この問題に関する
これは、シェルの選択に依存します。 Ksh93はプロセスのオーバーヘッドを制限するように設計されています。また、呼び出し元のシェルプロセス内のパイプライン*の最終要素を実行し、それによって状態を保持します。 –
Bash 4.2では、同じことをするオプションが導入されました。ジョブ制御( 'set + m')を止め、' lastpipe'オプションを設定します( 'shopt -s lastpipe')。 – chepner
私はそれを調べます。ありがとう! –