コピー/貼り付けを可能にするためにシェル変数と値を印刷するにはどうすればよいですか?

コピー/貼り付けを可能にするためにシェル変数と値を印刷するにはどうすればよいですか?

Bash 4.2.25ではset出力envはエスケープされていないため、シェルエスケープと印刷できない文字はコピーして貼り付けることはできません。次のシェルセッションを例に挙げます。

$ 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パイプの前にそれを使用する必要があります。

関連情報