我有一个看似简单的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
时,它按预期工作...
答案 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脚本意味着配置看起来就像一个配置脚本,你可以帮助未来的维护者。您还可以帮助自己将脚本代码模块化为不同的部分,每个部分都有一个独特的功能。