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)"
)