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

Mir*_*oZa 178 bash environment-variables

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

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH
Run Code Online (Sandbox Code Playgroud)

在我可以在终端上看到的命令和结果下方:脚本运行,但变量未在最后设置。

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

~$: 
Run Code Online (Sandbox Code Playgroud)

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

小智 247

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

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

source ./script.sh
echo "$BASE"
Run Code Online (Sandbox Code Playgroud)

会产生

/home/develop/trees
Run Code Online (Sandbox Code Playgroud)

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

. ./script.sh     # identical to "source ./script.sh"
Run Code Online (Sandbox Code Playgroud)

. script.sh并且source script.sh将首先查找script.shin PATH,因此指定 . 的路径更安全script.sh。)

  • 您不需要 `export` 将变量传递给子外壳,子外壳是当前外壳的副本,包括变量和函数等。导出的变量会被复制到从外壳产生的新进程中,无论该进程是另一个外壳或不。其次,`.` 是用于采购的 POSIX 命令。Bash 添加了 `source` 作为它的更具可读性的同义词,但你不能依赖它在 sh 中可用。最后`. ./script` 而不是 `. script` 如果你想避免意外。http://mywiki.wooledge.org/BashFAQ/060 (34认同)

con*_*use 20

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

或者(如果您真的希望脚本影响当前 shell 的环境)将其运行为:

. ./script.sh
Run Code Online (Sandbox Code Playgroud)

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


小智 7

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

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

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