我有一个看似简单的 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 上手动输入时,它按预期工作......
子 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 脚本看起来像配置脚本,可以帮助未来的维护人员。您还可以帮助自己将脚本代码模块化为不同的部分,每个部分都有其独特的功能。
作为旁注,请不要在您分配的同一行上导出。