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

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

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

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

~$: 

怎么了?

答案1

export将变量赋值导出到export运行该命令的 shell 的子进程。您的命令行环境是父母脚本的 shell,因此它看不到变量赋值。

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

source ./script.sh
echo "$BASE"

会产生

/home/develop/trees

source命令通常在脚本中看到,是 bash 的同义词.,它是 POSIX 标准的一部分(因此.例如在 dash 中可用,但source不是)。

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

. script.sh并且将首先在中source script.sh寻找,因此指定到的路径更安全。)script.shPATHscript.sh

答案2

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

或者(如果你确实希望脚本影响当前 shell 的环境)按如下方式运行它:

. ./script.sh

这会导致它在您当前的 shell 中运行,但也不会将变量传递到层次结构中。

答案3

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

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

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

相关内容