아무런 옵션 없이 set 명령을 사용하면 모든 쉘 변수와 함수의 이름과 값이 표시된다.
우리는 변수를 표시하고 출력에서 함수를 피하고 싶습니다.
답변1
이미 주석에서 지적했듯이 env
이는 내보낸 변수만 표시하므로 요구 사항을 충족하지 않습니다.
변수 정의처럼 보이지 않는 것을 필터링하기 위해 출력을 처리하는 set
것은 신뢰할 수 없는 해킹입니다. 특히, 값에 개행 문자가 포함된 변수를 놓칠 수 있습니다. 더 나쁜 것은, 잘 작성된 함수가 허위 변수 정의로 인해 어려움을 겪을 수 있다는 것입니다.
가장 간단한 해결책은 함수가 (일종의) 변수로 처리되지 않는 POSIX 모드로 일시적으로 전환하는 것입니다.
set -o posix
set
set +o posix
그러나 기본 모드가 이미 POSIX이거나 쉘이 설정된 POSIX 모드에서 명령이 작동하도록 하려는 경우 문제가 발생할 수 있습니다.
이 경우 해결 방법이 있습니다.
(set -o posix;set)
이는 subshell에서 실행되는 내장 명령에 대해서만 POSIX 모드를 설정하며 set
상위 쉘 모드는 영향을 받지 않습니다.
답변2
env
가장 간단한 해결책은 대신 사용하는 것이지만 제공되지는 않습니다 set
.env
모두기존 변수. 그러나 시작된 프로세스에 전달될 변수만 env
(예: 내보내지 않은 변수 없음) 또 다른 접근 방식은 set
공백이 아닌 문자열, an =
및 공백이 아닌 다른 문자열을 포함하는 줄의 출력을 검색하는 것입니다 .
set | grep -E '^\S+=\S'
그러나 이렇게 하면 여러 줄 값으로 설정된 변수(예: IFS
기본값에 a가 포함됨 \n
)가 누락됩니다.
답변3
이상한 이유로 declare -p
변수만 나열되는 것 같습니다.
$ declare -p
declare -x ANT_HOME="/usr/share/apache-ant"
declare -- BASH="/usr/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -A BASH_ALIASES=()
declare -a BASH_ARGC=()
declare -a BASH_ARGV=()
declare -A BASH_CMDS=()
...
물론 이는 declare
변수와 해당 속성을 모두 다시 생성하는 명령을 출력한다는 단점이 있습니다. 출력으로 무엇을 하려는지에 따라 이는 실제로 유용할 수 있습니다.
답변4
잘 모르겠지만 소는 여러 가지 생각을 합니다.
_____
( env )
-----
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
즉, 그냥 사용하세요 env
.
내 생각엔 그녀가 방금 jilliagre의 댓글을 읽은 것 같아요.
________________________________
/ But it will only show exported \
\ variables! /
--------------------------------
\ ^__^
\ (!!)\_______
(__)\ )\/\
!! ||----w |
|| ||