【问题标题】:bash script with variables not getting set [duplicate]未设置变量的bash脚本[重复]
【发布时间】:2020-11-10 10:35:55
【问题描述】:

我有一个看似简单的 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 时,它按预期工作......

【问题讨论】:

    标签: bash shell


    【解决方案1】:

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

    source ./env.sh
    

    那么发生了什么?当您通过bash env.shenv.sh 运行bash 脚本时,您正在生成一个具有自己环境的程序,该环境与其父环境分离。但是,当您在命令行运行脚本中包含的命令时,或使用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

    【讨论】:

    • 我会添加两个小东西。由于脚本不再执行:不再需要执行权限(只有阅读权限),shebang 也不再需要。