带有变量的Bash脚本未设置。

3
我是一名有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

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

#!/bin/bash
export CVE_ENV_DIR=$PWD

很容易,对吧?那么当我运行它时会发生什么呢?我得到以下输出:

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

$ 

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

6

子shell不能影响其父进程的环境。如果您想让脚本影响父进程的环境,则需要:

source ./env.sh

当你运行一个bash脚本时,无论是使用bash env.sh还是env.sh,你都会生成一个具有自己环境的程序,该环境与其父进程分离。但是,当你在命令行中运行脚本中包含的命令,或者使用source命令时,就没有生成新的环境。
编辑以解决@syme的评论。用于通过source读取的Bash脚本通常是纯配置,仅包含分配和计算。也可以通过聪明的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

制作一个旨在配置的bash脚本,使其看起来像一个配置脚本,这样可以帮助未来的维护者。通过将脚本代码模块化为不同的部分,并为每个部分提供独特的功能,您还可以帮助自己。
顺便说一句,请不要将导出与分配放在同一行

1
我还想添加两个小东西。由于脚本不再被执行,所以执行权限也不再必要(只需要读取权限),而且shebang也不再需要。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接