在与另一个脚本相同的行上定义shell脚本变量

use*_*048 4 unix shell ksh

我遇到了ksh脚本中的行,这些脚本声明了一个变量并在同一行上提供了另一个shell脚本.例如:

MYVARIABLE="abc" . ~core/script.sh
Run Code Online (Sandbox Code Playgroud)

这是否会产生与单独声明它们不同的行为?例如:

MYVARIABLE="abc"
. ~core/script.sh
Run Code Online (Sandbox Code Playgroud)

Jim*_*art 6

如果是

MYVARIABLE="abc" . ~core/script.sh
Run Code Online (Sandbox Code Playgroud)

MYVARIABLEabc在source(.)命令的持续时间内设置.所以它将在代码的范围内~core/script.sh.

如果是

MYVARIABLE="abc"
. ~core/script.sh
Run Code Online (Sandbox Code Playgroud)

它将在当前shell /脚本的范围内和范围内设置~core/script.sh.

尝试运行第一个,然后echo $MYVARIABLE看它仍然是空的(假设它开始为空).echo再次运行后者,您将看到它的值在当前shell中设置.

编辑:

请注意,在这两种情况下MYVARIABLE都可以看到~core/script.sh,但这只是因为您正在寻找脚本.如果您要运行可执行文件(甚至是可执行的shell脚本)而不是源代码,则行为会有所不同.

MYVARIABLE=foo /usr/local/bin/some_executable
Run Code Online (Sandbox Code Playgroud)

将在执行时将变量放在范围内,但是

MYVARIABLE=foo
/usr/local/bin/some_executable
Run Code Online (Sandbox Code Playgroud)

不会有范围的变量.为了将它传播到可执行文件/子shell,您必须export:

MYVARIABLE=foo
export MYVARIABLE
/use/local/bin/some_executable
Run Code Online (Sandbox Code Playgroud)

在比ksh(bash,zsh)更新的Bourne派生shell中,您可以组合赋值和导出:

export MYVARIABLE=foo
Run Code Online (Sandbox Code Playgroud)

但这在ksh中不起作用; 你需要两个陈述.