我们有两个脚本,first.sh
并且second.sh
.我们使用( ) 命令first.sh
来运行。second.sh
.
source
我被这个脚本困住了
首先.sh
value="myvalue"
export value
oldvalue="othervalue"
export value
初始化值并导出后,我们初始化了旧值并再次导出value
而不是oldvalue
,但othervalue
在脚本中仍然可用second.sh
,即使我们没有oldvalue
在 中导出first.sh
。
答案1
如果您使用 来获取第二个“脚本” .
,那么您将在同一脚本中运行第二个文件的内容,则您不会跑步一个单独的脚本。
例如,考虑这两个脚本,其中一个运行另一个:
$ 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
sets 和exportsvalue
以及sets 但不export ,然后作为单独的进程 oldvalue
运行。依次尝试打印这两个值。这是输出:script2
script2
$ ./script1
value: myvalue
oldvalue:
正如您所看到的,在这种情况下,您对两个变量可见性的期望是正确的——因为oldvalue
不是从 导出的script1
,所以它的值没有在 中定义script2
。
答案2
答案是,实际上您没有两个脚本,而是一个像include
其他编程语言一样分布在两个文件中的脚本。
因此,该变量不是通过两个脚本部分之间的环境传递的,它是可用的,因为它是同一 shell 进程的一部分。
这只有效,因为你运行
. first.sh
在访问变量之前。所以这适用于second.sh
. first.sh
echo "$oldvalue"
但这不会
echo "$oldvalue"
. first.sh