我编写了以下脚本来在需要时设置一些环境变量。

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH


下面的命令和结果可以在终端上看到:脚本运行了,但是

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 


怎么了?
预先感谢。
Mirko

评论

外壳是分层打开的。您可以使用设置父级外壳的var。 ./yourscript.sh

#1 楼

export将变量分配导出到运行export命令的Shell的子进程。您的命令行环境是脚本外壳程序的父级,因此看不到变量分配。

您可以使用.(或source)bash命令在当前外壳程序中执行脚本命令环境并实现您想要的功能,例如

source ./script.sh
echo "$BASE"


会产生

/home/develop/trees


source命令,经常见到在脚本中,是.的bash同义词,它是POSIX标准的一部分(例如,.可在破折号中使用,但source不可用)。

. ./script.sh     # identical to "source ./script.sh"


. script.shsource script.sh首先会在script.sh中查找PATH,因此更安全地指定指向script.sh的路径。)

评论


您无需导出即可将变量传递到子shell,子shell是当前shell的副本,包括变量和函数等。导出的变量将复制到从shell产生的新进程中,而不管该进程是否是另一个shell。 。其次, 。是用于采购的POSIX命令。 Bash将源添加为它更易读的同义词,但是您不能依靠它在sh中可用。最后 。 ./script而不是。脚本,如果您想避免意外。 mywiki.wooledge.org/BashFAQ/060

– Geirha
11年7月18日在5:55



请注意,如果您来源脚本并使用管道,则来源环境不可用于父级。例如'source setit.sh'是可以的。 'source setit.sh | tee setit.log'不好。奇怪。不直观。

–gaoithe
16 Sep 8'在11:47

#2 楼

当您运行脚本时,它将在子外壳程序中运行。变量仅在该子shell的上下文中有效。在您的.bashrc.profile中进行设置,然后阅读变量和子外壳。 export语句可以降低层次结构(当前shell及其所有子shell)的性能,而不像您的示例中那样正常运行。

(如果您确实希望脚本影响当前shell的环境),请按以下方式运行它:

. ./script.sh


这会使其在您当前的shell中运行,但也不会在层次结构中传递变量。

#3 楼

我经常想轻松地设置环境变量。

这是我添加到.bashrc中以实现此方便的功能。

defect() {
    if [  ] && [ -z  ]
    then
        eval 'export DEFECT='
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}