bash 脚本中的变量未设置

std*_*err 3 bash shell

我有一个看似简单的 bash 脚本来设置我的环境:前两行是:

#!/bin/bash
export CVE_ENV_DIR=$PWD
Run Code Online (Sandbox Code Playgroud)

容易吗,嘿?好吧,看看运行它时会发生什么,我得到以下输出:

$ echo $PWD
/work/env
$ ./env.sh 
$ echo $CVE_ENV_DIR

$ 
Run Code Online (Sandbox Code Playgroud)

为什么 CVE_ENV_DIR 没有设置为/work/env?这里发生了什么?当我export CVE_ENV_DIR=$PWD在 shell 上手动输入时,它按预期工作......

bis*_*hop 6

子 shell 不能影响其父 shell 的环境。如果您希望脚本影响父环境,您需要:

source ./env.sh
Run Code Online (Sandbox Code Playgroud)

发生什么了?bash env.sh当您通过或运行 bash 脚本时env.sh,您将生成一个具有自己的环境的程序,该环境与其父环境分离。但是,当您在命令行运行脚本中包含的命令或使用 时source,不会生成环境。


编辑以解决@syme 的评论。用于读取的 Bash 脚本source通常是纯配置,仅包含赋值和计算。还可以通过巧妙的 she-bang hack让它们变得更有帮助和自我记录,例如:

#!/bin/echo USAGE: source 
# Default configuration file for the Frobnicator package.

FOO=bar
BAR=$(stat /baz)
[[ -f /baz ]] && BAZ=file || BAZ=

export FOO BAR BAZ
Run Code Online (Sandbox Code Playgroud)

使用于配置的 bash 脚本看起来像配置脚本,可以帮助未来的维护人员。您还可以帮助自己将脚本代码模块化为不同的部分,每个部分都有其独特的功能。

作为旁注,请不要在您分配的同一行上导出