Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 导出在另一个文件中定义的变量_Linux_Bash_Shell - Fatal编程技术网

Linux 导出在另一个文件中定义的变量

Linux 导出在另一个文件中定义的变量,linux,bash,shell,Linux,Bash,Shell,我有一个脚本,其中包含两个需要设置为环境变量的变量 变量列表不断变化,在我这边修改它不是一个选项。你知道我该怎么做吗 示例文件foo.sh FOO="FOOFOO" BAR="BARBAR" 您正在查找“.”命令(在bash中也拼写为“source”): 由于还需要将它们导出到环境中,因此可能需要做一些额外的工作: while read -r line; do export "$line" done < foo.sh 读取-r行时;做 导出“$line” 完成

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

变量列表不断变化,在我这边修改它不是一个选项。你知道我该怎么做吗

示例文件foo.sh

FOO="FOOFOO"
BAR="BARBAR"

您正在查找“.”命令(在
bash
中也拼写为“source”):

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

while read -r line; do
    export "$line"
done < foo.sh
读取-r行时
;做
导出“$line”
完成
变量和环境变量之间存在差异。如果执行
。foo.sh
foo.sh
包含行
foo=value
,那么变量
foo
将在当前进程中分配。它不是一个环境变量。若要成为环境变量(从而可用于子壳),必须将其导出。但是,Shell提供了一个选项,使所有变量指定都将变量升级为环境变量,因此如果您只需执行以下操作:

set -a
. foo.sh
set +a

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

如果希望仅导出具有公共前缀的变量,例如:

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

我创建了另一个脚本bar.sh,它在读取行时具有源foo.sh;确实导出“$line”donesource bar.sh以及影响当前环境。此外,
while
循环代替
source foo.sh
;你不需要两者兼而有之。这没有错,只是多余的。请注意,它不会与源代码脚本中的任何bash逻辑一起工作。@JakubM。是的,虽然我保守地认为这是一个特性。配置文件应该只包含数据,而不是代码。在纯数据赋值和完整的源代码脚本这两个极端之间,理论上存在一个子集
bash
,它保证终止。是最近设计的一种语言的示例,它允许在配置文件的上下文中有限地执行。非常感谢,这治好了一些头痛。在将变量传递给fcron处理的作业时,或者在处理nullmailer的环境变量时,这很方便。
. foo.sh
variable_list=()
variable_list=( $(set -o posix ; set  |\
                  grep "BAZ_"         |\
                  cut -d= -f1) )
for variable in "${variable_list[@]}"
do
  export "$variable"
done