在 Ubuntu 16.04 中,我执行了一个脚本(脚本 1),该脚本本身执行另外两个脚本(脚本 2 和脚本 3)。
${x}
脚本 3 包含对脚本 2 ( ) 中已声明的变量的变量替换 ( ) x=y
。
当然,在执行脚本 3 之前,我确保执行source
脚本 2,以便将来在脚本 3 或其他地方允许变量替换。
问题是,当我执行脚本 3(通过脚本 1)时,变量替换失败并且结果不完美,但在手动执行中它成功了。
为什么通过脚本1执行脚本3时变量替换失败,而手动执行却成功,如何确保确实会发生?
如果sourcing
脚本 2 还不够,那么我不知道还不够。
答案1
这是一个变量范围问题,与脚本是从命令行手动执行还是由另一个脚本执行完全无关。
未导出到环境的 Shell 变量对子进程(包括子 shell)不可见
script2
如果您在 内部进行采购script3
,那么script3
将看到 中定义的所有变量,script2
因为它们都发生在 的范围内script3
。如果您同时对script2
和script3
inside进行采购,则结果几乎相同script1
(但在这种情况下,一切都发生在 的范围内script1
)
但是,如果您在script2
内部采购script1
然后执行(不是source) script3
from script1
,那么script3
只会看到定义或更改的变量(script2
如果它们碰巧被导出)。
变量何时何地导出并不重要,只要它发生就行前 script3
被执行。变量可以在script1
或 中导出script2
,甚至可以在开始执行的父 shell(或其 .profile/.bashrc/etc)中导出script1
。