2つのスクリプトがあり、()コマンドを使用して実行しますfirst.sh
。second.sh
first.sh
second.sh
.
source
このスクリプトが詰まっています。
First.sh
value="myvalue"
export value
oldvalue="othervalue"
export value
値を初期化してエクスポートした後、以前の値を初期化して再エクスポートしましたvalue
がoldvalue
。othervalue
second.sh
oldvalue
first.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つの値を順番に印刷してみてください。出力は次のとおりです。script2
script2
$ ./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