如何将env输出为可运行的shell脚本

时间:2014-11-26 00:45:44

标签: bash

您可以使用

将环境简单地输出为可运行的shell脚本
env > my_env

......稍后在另一个剧本......

set -a
source my_env

这适用于最琐碎的情况,但如果任何特殊的字符或空格在env中则会失败。

如何修复上述脚本,以便与a='"'"'"之类的内容一起使用?

3 个答案:

答案 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