korn shell 和环境变量

korn shell and environment variables

env 和 start.env 应该 运行 在任何 shell 中。 它实际上确实如此,但 KORN 除外,其中 env 变量设置的行为与我期望的不同。所以看例子。

文件set.env:

#!/bin/bash
export MY_VAR="home" || setenv MY_VAR "home"

文件start.sh:

#!/bin/bash
command . ./set.env || source set.env
echo "$MY_VAR"

我可以看到变量的打印。 但是如果尝试在 ksh 下的终端中回显它,它就会变成未定义。

ksh$ start.sh
home
ksh$ echo $MY_VAR

ksh$

我希望在我的会话中看到 $MY_VAR...有什么想法吗? //运行 红帽下

当您 运行 start.sh 时,您将它作为子命令执行,而不是获取它。因此,它对环境变量所做的更改仅限于该进程及其子进程;一旦进程退出,它设置的环境变量就会随之消失。

为了可移植地获取脚本,在您当前的 shell 中执行它,从而在 shell、运行:

中设置环境变量
# this works on any POSIX shell, including ksh (and bastardizations such as mksh)
. start.sh

...或者,不太便携:

# this is a bashism
source start.sh

顺便说一句,作为一种实践,command . ./set.env 是……奇怪的。 command 阻止执行 shell 函数,但是任何定义了名为 . 的函数的环境都可以说是一个有问题的环境。单独考虑. start.sh