.sh
我使用 Bash 4.3.48(1),并且在 shebang 下有一个包含大约 20 个变量的文件。该文件仅包含变量。
这是模式:
x="1"
y="2"
...
我需要将所有这些变量导出到干燥方式:例如,1export
对应所有变量,而不是说 20export
对应 20 个变量。
最优雅的方法是什么(最短、最有效)里面那个文件?
一个for
循环?一个array
?也许比这些更简单(某种集合糖语法)?
答案1
在文件顶部使用set -a
(或等效的) 来启用shell 选项。然后在文件末尾(如果适用)使用(或) 来禁用shell 选项。set -o allexport
allexport
set +a
set +o allexport
allexport
使用启用allexport
shell 选项将产生以下效果(来自手册bash
):
创建或修改的每个变量或函数都被赋予导出属性,并标记为导出到后续命令的环境。
这个 shell 选项,用set -a
或设置set -o allexport
,是POSIX 中定义sh
(因此应该在所有类似的 shell中可用)
当此选项打开时,出口应为执行赋值的每个变量设置属性; [...]如果命令中的赋值位于实用程序名称之前,则出口实用程序完成后,属性不应保留在当前执行环境中,但前面的特殊内置实用程序之一会导致出口内置完成后仍保留的属性。如果分配不在命令中的实用程序名称之前,或者如果分配是
getopts
或实用程序操作的结果read
,则出口属性应持续存在,直到变量被取消设置。
启用此选项时设置的变量将被导出,即放入环境变量中。像往常一样,这些环境变量将可用于当前 shell 环境以及任何随后创建的子进程环境。
这意味着您必须
- 获取此文件(使用
.
、 或source
在具有此命令的 shell 中),或者 - 启动应该有权访问该文件中的变量的进程。
答案2
这是一个技巧:
source <(sed 's/^/export /' file.sh)
我假设你的 shell 就像 bash 并且支持流程替代
或者,编辑文件本身:
sed -i 's/[^=]\+/export &; &/' file.sh