복사/붙여넣기가 가능하도록 쉘 변수와 값을 인쇄하려면 어떻게 해야 합니까?

복사/붙여넣기가 가능하도록 쉘 변수와 값을 인쇄하려면 어떻게 해야 합니까?

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파이프 전에 이를 사용해야 할 수도 있습니다.

관련 정보