在 Bash 4.2.25 中,set
andenv
输出不会被转义,因此 shell 转义和任何不可打印的字符将无法复制粘贴。以这个 shell 会话为例:
$ export foo=$'a\nbar=\baz'
$ env | grep -A 1 foo
foo=a
baraz
例如颜色也是如此 - 它们是按字面打印的,并且可能会弄乱终端。如何打印所有变量及其值,以便可以复制和粘贴输出以提供相同的环境?*
$_
* 显然有关于只读变量、特殊变量等的标准警告。
答案1
你可以这样做:
printvars() (
eval 'declare() { printf declare; printf " %q" "$@"; echo; }'"
$(declare -p)"
)
printvars
这可以很容易地扩展以省略只读变量,例如:
printvars() (
eval 'declare() {
[[ $1 = *r* ]] && return
printf declare; printf " %q" "$@"; echo
}'"
$(declare -p)"
)
答案2
escaped_env() {
cat /proc/self/environ | while IFS== read -r -d '' name value
do
printf '%s=%q\n' "$name" "$value"
done
}
会话示例:
$ export foo=$'a\nbar=\baz'
$ escaped_env | grep foo
foo=$'a\nbar=\baz'
这有效,但仅适用于export
ed 变量,并且set
似乎没有 ␀ 分隔符选项。
仅供参考,/proc 文件系统不是POSIX.1-2008功能,而且看起来只有Linux实现/proc/self/environ
.如果您的操作系统没有此文件,您可能需要env --null
在管道之前使用。