env -0 dump environment. But how to load it?
linux命令行工具env可以转储当前环境。
由于有一些特殊字符我想使用env -0(以0字节而不是换行结束每个输出行)。
但是如何再次加载这个转储呢?
Bash版本:4.2.53
-
load是什么意思?
-
@ hek2mgl使用"load"我的意思是将这些变量设置在不同的shell中。
不要使用env; 使用declare -px,以可重新执行的形式输出导出变量的值。
1 2
| $ declare -px > env.sh
$ source env.sh |
这也为您提供了保存非导出变量的可能性,env无权访问:只需使用declare -p(删除-x选项)。
例如,如果您编写foo=$'hello
world',则env会生成输出
而declare -px产生输出
1 2
| declare -x foo="hello
world" |
如果要加载env的导出,可以使用从文件设置环境变量中描述的内容:
1 2 3 4
| env > env_file
set -o allexport
source env_file
set +o allexport |
但如果您碰巧使用-0导出,则使用(来自man env):
-0, --null
end each output line with 0 byte rather than newline
因此,您可以使用0作为字符分隔符来循环遍历文件以标记行的结尾(更多描述在IFS =在此bash循环中执行的操作:cat file | while IFS= read -r line; do … done):
1 2 3 4 5
| env -0 > env_file
while IFS= read -r -d $'\0' var
do
export"$var"
done < env_file |
-
第一种解决方案在我的情况下不起作用:env > env_file set -o allexport source env_file输出-bash: PROFILEREAD: readonly variable bash: 52052: command not found ... (a lot of command not found messages)
-
第二个解决方案(env -0)可以工作,除了:PROFILEREAD readonly variable
-
@guettli嗯,这是因为你的变量被设置为只读。 关于如何重置它们有一些黑客...
-
@guettli关于第一个评论,单独采购env,这是因为新行被认为是新变量,所以它会混淆一切。
-
那是因为env的输出并不是一个有效的shell脚本,这是source所期望的。 因此,如果任何变量有空格,换行符,美元符号等,那些将由shell解析,就好像它们在任何其他脚本中一样。 使用declare -p的最佳答案是正确的方法。