シェルスクリプトの「エクスポート」変数

シェルスクリプトの「エクスポート」変数

2つのスクリプトがあり、()コマンドを使用して実行しますfirst.shsecond.shfirst.shsecond.sh.source

このスクリプトが詰まっています。

First.sh

 value="myvalue"
 export value

 oldvalue="othervalue"
 export value

値を初期化してエクスポートした後、以前の値を初期化して再エクスポートしましたvalueoldvalueothervaluesecond.sholdvaluefirst.sh

答え1

次のようにして2番目の「スクリプト」を取得.すると、走る別のスクリプトです。

たとえば、次の2つのスクリプトを考えてみましょう。その一つは走るもう一つ:

$ ls
script1*    script2*

$ cat script1
#!/bin/bash

export value="myvalue"
oldvalue="othervalue"

# Here script1 is running the second script (not sourcing it)
./script2

$ cat script2
#!/bin/bash

echo "value: ${value}"
echo "oldvalue: ${oldvalue}"

セットscript1とエクスポートとセットは、エクスポートではなくvalue別々のプロセスとして oldvalue実行されます。これら2つの値を順番に印刷してみてください。出力は次のとおりです。script2script2

$ ./script1
value: myvalue
oldvalue:

ご覧のとおり、この場合、2つの変数の可視性に対する期待は正確です。oldvalueから派生していないため、script1その値はで定義されていませんscript2

答え2

答えは、実際には2つのスクリプトがあるのではなく、include他のプログラミング言語と同じように、2つのファイルに1つのスクリプトが分散されているということです。

したがって、変数は2つのスクリプト部分間の環境を介して渡されず、同じシェルプロセスの一部であるため使用できます。

これはあなたが実行しているので動作します

. first.sh

変数にアクセスする前に、これはうまくいきますsecond.sh

. first.sh
echo "$oldvalue"

しかし、これはできません。

echo "$oldvalue"
. first.sh

関連情報