如何打印 shell 变量和值以便能够复制/粘贴它们?

如何打印 shell 变量和值以便能够复制/粘贴它们?

在 Bash 4.2.25 中,setandenv输出不会被转义,因此 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'

这有效,但仅适用于exported 变量,并且set似乎没有 ␀ 分隔符选项。

仅供参考,/proc 文件系统不是POSIX.1-2008功能,而且看起来只有Linux实现/proc/self/environ.如果您的操作系统没有此文件,您可能需要env --null在管道之前使用。

相关内容