在 shell 脚本中“导出”变量

在 shell 脚本中“导出”变量

我们有两个脚本,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}"

请注意,script1sets 和exportsvalue以及sets 但不export ,然后作为单独的进程 oldvalue运行。依次尝试打印这两个值。这是输出:script2script2

$ ./script1
value: myvalue
oldvalue:

正如您所看到的,在这种情况下,您对两个变量可见性的期望是正确的——因为oldvalue不是从 导出的script1,所以它的值没有在 中定义script2

答案2

答案是,实际上您没有两个脚本,而是一个像include其他编程语言一样分布在两个文件中的脚本。

因此,该变量不是通过两个脚本部分之间的环境传递的,它是可用的,因为它是同一 shell 进程的一部分。

这只有效,因为你运行

. first.sh

在访问变量之前。所以这适用于second.sh

. first.sh
echo "$oldvalue"

但这不会

echo "$oldvalue"
. first.sh

相关内容