posix shell: 환경 변수 이름 목록 인쇄(값 없음)

posix shell: 환경 변수 이름 목록 인쇄(값 없음)

여러 구현과 호환되는 posix 호환 방식으로 현재 정의된 환경 변수 목록을 인쇄하는 방법아니요그들의 가치는?

일부 구현(mksh, freebsd /bin/sh)에서는 그 export자체로 사용하면 충분합니다.

$ export
FOO2
FOO

그러나 일부 다른 구현(bash, zsh, dash)의 경우 export에도 이 값이 표시됩니다. Bash를 예로 들어 보겠습니다.

$ export
export FOO2='as  df\
  asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd  kjasdf:\
   asdkj=fkajdsf:\
       :askjfkajsf=asdfkj:\
   safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
  asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd  kjasdf:\$
   asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
   safdkj$

envor 와 같은 다른 옵션에는 printenv값 없이 변수 이름만 인쇄하는 옵션이 없습니다. 적어도 제가 시도한 Linux 및 freebsd 플랫폼에서는 그렇지 않습니다.

파이프를 통해 awk/sed/etc에 연결합니다. 또는 매개변수 확장 기술(예: )을 사용하여 목록을 트리밍하는 것은 허용되지만 행에 걸쳐 있을 수 있고 값에 공백을 포함할 수 있는 값을 ${foo%%=*}처리해야 합니다 (위 예 참조).=

특정 쉘 구현과 관련된 답변은 흥미롭지만 주로 구현 간 호환되는 것을 찾고 있습니다.

답변1

awk에서 이것은 매우 간단합니다.

awk 'BEGIN{for(v in ENVIRON) print v}'

그러나 일부 awk 구현은 자체 환경 변수를 추가한다는 점에 유의하십시오(예: GNU awk add AWKPATHAWKLIBPATHto ENVIRON).

환경 변수 이름에 개행 문자가 포함되어 있으면 출력이 모호해집니다. 이는 매우 드물지만 기술적으로 가능합니다. 순수한 sh 솔루션은 어려울 것입니다. 가장 좋은 방법은 시작하는 것이지만 export -p순수한 sh로 마사지하는 것은 어렵습니다. sed를 사용하여 출력을 처리 export -p한 다음 sed를 사용하여 eval참조하는 내용을 삭제하도록 쉘에 지시할 수 있습니다. Bash 및 zsh는 비표준 접두사를 인쇄합니다.

report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
                         s/^declare -x /report /;
                         s/typeset -x /report /")"

셸에 따라 export -p이름이 셸에서 유효하지 않은 변수가 표시될 수도 있고 표시되지 않을 수도 있으며, 그렇지 않은 경우 이름이 올바르게 인용되거나 인용되지 않을 수도 있습니다. 예를 들어 dash, mksh 및 zsh는 이름에 개행 문자가 포함된 변수를 생략하고 BusyBox dash 및 ksh93 raw는 이를 인쇄하며 bash raw는 해당 값을 포함하지 않고 인쇄합니다. 신뢰할 수 없는 입력을 방어해야 하는 경우 순수 POSIX 솔루션 eval에 의존하지 말고 export -p.

답변2

나는 간단한 것을 좋아합니다. 이것은 POSIX 시스템에서 작동합니다.

printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM

답변3

이것은내 거여러 줄의 값이 있는 환경 변수를 훌륭하게 처리하는 솔루션:

env -0 | cut -z -f1 -d= | tr '\0' '\n' | sort | column

그러면 개행 문자( ) 대신 변수를 구분하기 위해 NUL을 사용하여 환경이 인쇄됩니다 env -0.

그런 다음 변수를 제거합니다.가치using은 첫 번째 필드입니다. cut -z -f1 -d=여기서 이 -z옵션은 NUL로 구분된 레코드를 지정하고 필드가 다음으로 구분됨을 나타냅니다.-f1-d==

tr '\0' '\n'NUL 구분 기호를 개행 문자로 변환합니다.

그런 다음 변수 이름을 정렬하여 열에 표시하고 싶습니다.

답변4

또 다른 방법은 grep을 사용하는 것입니다.

printenv|grep -o "^[^=]\+"

관련 정보