Ubuntu 16.04では、2つの異なるスクリプト(スクリプト2とスクリプト3)を独自に実行する1つのスクリプト(スクリプト1)を実行しました。
${x}
スクリプト3には、スクリプト2()で宣言された変数の変数置換()が含まれていますx=y
。
もちろん、スクリプト3を実行する前にsource
スクリプト2を実行して、将来のスクリプト3または他の場所で変数の置換を許可するようにしてください。
問題は、スクリプト1を介してスクリプト3を実行すると変数の置換が失敗し、結果が完璧ではなく、手動実行では成功することです。
スクリプト1を介してスクリプト3を実行すると変数置換が失敗しますが、手動で実行すると成功するのはなぜですか.
スクリプト2が十分でsourcing
ない場合はわかりません。
答え1
これは変数スコープの問題であり、スクリプトがコマンドラインで手動で実行されるのか、他のスクリプトによって実行されるのかはまったく関係ありません。
環境にエクスポートされていないシェル変数は、子プロセス(サブシェルを含む)には表示されません。
script2
内部でソーシングする場合の範囲内で発生するため、 で定義されたすべての変数が表示されscript3
ます。内部と内部の両方のソースを使用する場合、結果はほぼ同じです(ただし、この場合はすべての範囲内で発生します)。script3
script2
script3
script2
script3
script1
script1
ただしscript2
、内部でソーシングする場合は、script1
次のようにします(いいえソース)script3
fromのscript1
場合、script3
定義または変更された変数のみが表示されます(script2
エクスポートされた場合)。
変数がエクスポートされる限り、いつどこで変数をエクスポートするかは重要ではありません。今後 script3
処刑される。変数は、実行が開始された親シェル(または対応する.profile / .bashrc / etc)script1
から、またはそのシェルからエクスポートすることもできます。script2
script1