set 명령으로 표시된 기능을 제거하는 방법은 무엇입니까? [복사]

set 명령으로 표시된 기능을 제거하는 방법은 무엇입니까? [복사]

아무런 옵션 없이 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 |
                ||     ||

관련 정보