여러 구현과 호환되는 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$
env
or 와 같은 다른 옵션에는 printenv
값 없이 변수 이름만 인쇄하는 옵션이 없습니다. 적어도 제가 시도한 Linux 및 freebsd 플랫폼에서는 그렇지 않습니다.
파이프를 통해 awk/sed/etc에 연결합니다. 또는 매개변수 확장 기술(예: )을 사용하여 목록을 트리밍하는 것은 허용되지만 행에 걸쳐 있을 수 있고 값에 공백을 포함할 수 있는 값을 ${foo%%=*}
처리해야 합니다 (위 예 참조).=
특정 쉘 구현과 관련된 답변은 흥미롭지만 주로 구현 간 호환되는 것을 찾고 있습니다.
답변1
awk에서 이것은 매우 간단합니다.
awk 'BEGIN{for(v in ENVIRON) print v}'
그러나 일부 awk 구현은 자체 환경 변수를 추가한다는 점에 유의하십시오(예: GNU awk add AWKPATH
및 AWKLIBPATH
to 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 "^[^=]\+"