变量未设置的bash脚本

时间:2018-05-15 02:14:12

标签: bash shell

我有一个看似简单的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 个答案:

答案 0 :(得分:3)

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

source ./env.sh

那是怎么回事?当您运行bash脚本时,无论是bash env.sh还是env.sh,您都会生成一个具有自己环境的程序,这个环境与其父项脱离。但是,当您在命令行中运行脚本中包含的命令或使用source时,没有衍生环境。

编辑以解决@ syme的评论。意味着使用source读取的Bash脚本通常是纯配置,仅包含赋值和计算。也可以通过clever 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脚本意味着配置看起来就像一个配置脚本,你可以帮助未来的维护者。您还可以帮助自己将脚本代码模块化为不同的部分,每个部分都有一个独特的功能。

作为旁注,请不要export on the same line as you assign