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기능을 수행하고 있는 것 같습니다.리눅스구현 /proc/self/environ
운영 체제에 이 파일이 없으면 env --null
파이프 전에 이를 사용해야 할 수도 있습니다.