BASH脚本设置环境变量不起作用


136

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

#!/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

~$: 

怎么了?提前致谢。米尔科

Answers:


192

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

您可以使用.(或source)bash命令在当前Shell环境中执行脚本命令并实现所需的功能,例如

source ./script.sh
echo "$BASE"

会产生

/home/develop/trees

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

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

. script.shsource script.sh将首先查找script.shPATH,所以它的安全指定路径script.sh。)


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

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

10

当您运行脚本时,它将在子外壳程序中运行。变量仅在该子shell的上下文中有效。在您的.bashrc或中设置它们,.profile然后阅读 变量和子shell。该export语句使层次结构(当前shell及其所有子shell)失效,而不像您的示例那样升高。

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

. ./script.sh

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


5

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

这是我添加到.bashrc中以实现此便利的内容。

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

-1

你可以尝试这样的事情

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.