2

次の2つのスクリプトがあります。

「scr1.sh」

#!/bin/sh

func_in_scr1()
{

    echo func_in_scr1 var is $var


}

var=7645

func_in_scr1 &

( func_in_scr1 )

./scr2.sh

「scr2.sh」

echo in scr2 var is $var

出力は次のとおりです。

  • func_in_scr1 変数は 7645 です
  • func_in_scr1 変数は 7645 です
  • scr2のvarは

質問:

  1. scr1.sh の関数を bg およびサブシェルで実行すると、$var の値にアクセスできました。
  2. ただし、scr2.sh は $var の値にアクセスできませんでした。

サブプロセス (子プロセス) はエクスポートされた変数にのみアクセスでき、エクスポートされていない変数にはアクセスできないという印象を受けていたので、#1 には特に驚きました。

誰かがこの結果を説明できますか?

4

1 に答える 1

2

これらの 2 つの場合:

func_in_scr1 &
( func_in_scr1 )

サブシェルを開始します。それらは別のプロセスでもありますが、親シェルのすべての変数が表示されます (ただし、もちろん、この変数の変更を元に戻すことはできません。親の fork() 中に作成された単純なコピーです)。

この場合

./scr2.sh

サブシェルはありません。別のプロセスを実行します。親シェルはそれについて何も知りません。Ant には、エクスポート以外に変数を与える機能はありません。

于 2012-06-19T07:15:28.530 に答える