【问题标题】:Export variables defined in another file导出另一个文件中定义的变量
【发布时间】:2013-01-31 23:38:52
【问题描述】:

我有一个脚本,其中包含几个需要设置为环境变量的变量

变量列表不断变化,我无法修改它。知道我将如何去做吗?

示例文件 foo.sh

FOO="FOOFOO"
BAR="BARBAR"

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    变量和环境变量是有区别的。如果你执行. foo.sh并且foo.sh包含FOO=value这一行,那么变量FOO将会在当前进程中被赋值。它不是环境变量。要成为环境变量(因此可用于子 shell),它必须被导出。但是,shell 提供了一个选项,它使所有变量赋值都将变量提升为环境变量,所以如果你只是这样做:

    set -a
    . foo.sh
    set +a
    

    那么 foo.sh 中的所有变量赋值都会成为当前进程中的环境变量。请注意,这并非完全正确:在 bash 中,导出变量使其成为当前 shell 中的环境变量,但在其他 shell(例如破折号)中,导出变量不会使其成为当前 shell 中的环境变量。 (但是,它确实会导致在子shell 的环境中对其进行设置。)但是,在shell 的上下文中,变量是否是当前进程中的环境变量并不重要。如果它被导出(并因此设置在任何子流程的环境中),则不在环境中的变量在功能上等同于环境变量。

    【讨论】:

    • 非常感谢,这治愈了一些头痛。这在将变量传递给 fcron 处理的作业时会派上用场。
    • ...或者在处理 nullmailer 的环境变量时。
    【解决方案2】:

    您在寻找“.”吗?命令(在bash 中也拼写为“源”):

    source foo.sh
    

    由于您还需要将它们导出到环境中,因此您可能需要做一些额外的工作:

    while read -r line; do
        export "$line"
    done < foo.sh
    

    【讨论】:

    • 我创建了另一个脚本 bar.sh,它在读取行时具有源 foo.sh; do export "$line" done
    • 您还需要source bar.sh 才能影响当前环境。
    • 另外,while 循环代替了source foo.sh;你不需要两者。没有错,只是多余。
    • 请注意,它不适用于源脚本中的任何 bash 逻辑。
    • @JakubM。是的,尽管我保守地认为这是一个功能。配置文件应该只包含数据,而不是代码。在纯数据分配的两个极端和完整的源脚本之间存在一个理论子集bash,它保证会终止。 dhall 是最近的一个语言示例,旨在允许在配置文件的上下文中进行有限执行。
    【解决方案3】:

    如果您只想导出具有公共前缀的变量,例如:

    BAZ_FOO="FOOFOO"
    BAZ_BAR="BARBAR"
    

    你可以这样做:

    . foo.sh
    variable_list=()
    variable_list=( $(set -o posix ; set  |\
                      grep "BAZ_"         |\
                      cut -d= -f1) )
    for variable in "${variable_list[@]}"
    do
      export "$variable"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多