您可以使用
将环境简单地输出为可运行的shell脚本env > my_env
......稍后在另一个剧本......
set -a
source my_env
这适用于最琐碎的情况,但如果任何特殊的字符或空格在env中则会失败。
如何修复上述脚本,以便与a='"'"'"
之类的内容一起使用?
答案 0 :(得分:4)
使用set
代替env
:
○ → set | grep LESS
LESS=-R
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
○ → env | grep LESS
LESS=-R
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
感谢this similar question我们可以这样做以获取JUST环境变量,如下所示:
○ → (set -o posix; set) | grep LESS
LESS=-R
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
尝试这个庞然大物,它应该打印出与“原始”外壳不同的区别。 YMMV:
diff --old-line-format='%L' --unchanged-line-format= --new-line-format= \
<(bash -c 'set -o posix; set' | sort) \
<(env -i bash -c 'set -o posix; set' | sort)
答案 1 :(得分:4)
以下使用bash的printf %q
来正确转义值,无论其内容如何。只要所使用的操作系统首先支持/proc/self/environ
工具,只要shell输出其输出为bash,它就可以保证按字面意思处理任何可能的值 - 引号,换行符等。由Linux提供,以NUL分隔的流方式发出环境内容。它使用特殊的引用形式,如$'\n'
,并在适当的地方使用,因此纯POSIX解释器可能无法满足其输出。
#!/usr/bin/env bash
while IFS= read -r -d '' kvname; do
k=${kvname%%=*}
v=${kvname#*=}
printf '%q=%q\n' "$k" "$v"
done </proc/self/environ
请注意,如果您希望更改当前的shell环境,那么您希望 source 输出,而不是将其作为外部可执行文件运行。如果您在采购之前不想set -a
,请在格式字符串中添加前导export
。
答案 2 :(得分:3)
最简单的解决方案似乎是
export -p > my_env