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