当前位置: 首页>>技术教程>>正文


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

~$: 

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

最佳解决思路

export将变量赋值导出到sub-shells,即作为包含export指令的shell的子进程启动的shell。您的命令行环境是脚本 shell 的父级,因此它看不到变量分配。

您可以使用source bash命令在当前shell环境中执行脚本命令并实现您想要的操作,例如,

source script.sh
echo $BASE

会产生

/home/develop/trees

.命令是source的同义词,通常在脚本中可以看到。

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

次佳解决思路

我经常想设置一个环境变量而不麻烦。

这是我添加到我的.bashrc实现这种便利。


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

第三种解决思路

当你运行一个脚本时,它运行在一个子shell中。变量仅在该子 shell 的上下文中有效。将它们设置在.bashrc.profile中,并在variables and subshells上进行读取。 export语句在您的示例中不起作用(当前shell和所有子shell)。

或者(如果你真的想让脚本影响当前shell的环境),请将其作为:

. ./script.sh

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/701.html,未经允许,请勿转载。