환경 변수의 현재 값을 표시하는 방법?


24

시스템 환경을 확인할 때 많은 환경 변수가 나타납니다. 특정 변수를 어떻게 검색 할 수 있습니까?

내가 읽고있는 책은 다음과 같이 말합니다.

때로는 환경의 변수 수가 상당히 커져서 하나에 관심이있을 때 표시된 모든 값을보고 싶지 않습니다. 이 경우 echo명령을 사용하여 환경 변수의 현재 값을 표시 할 수 있습니다 .

Linux 터미널에서 어떻게합니까?

답변:


25

다만:

echo "$VARIABLENAME"

예를 들어 환경 변수의 $HOME경우 다음을 사용하십시오.

echo "$HOME"

그런 다음 비슷한 것을 인쇄합니다.

/home/username

편집 : Stéphane Chazelas의견에 따르면 다음 printenv대신에 사용 하는 것이 좋습니다 echo.

printenv HOME

4
zsh 또는 rc / es 구문을 암시하지 않는 한 따옴표를 잊어 버렸습니다. echo변수의 내용을 변형시킬 수 있으므로 명령을 잘못 선택합니다. 쉘 매개 변수의 내용을 동일한 이름으로 출력합니다. 즉, Bourne 쉘을 사용하는 경우 반드시 동일하지 나 ENV에 대해 같은 바르 1, *예를 들면. 그리고 이름이 쉘 변수 이름으로 유효하지 않은 env vars에는이 방법을 사용할 수 없습니다.
Stéphane Chazelas

5
또한 이름이 같은 환경 항목이 여러 개있는 경우 (병리 적 경우), 셸에 따라 달라집니다 (일반적으로 첫 번째 항목 또는 마지막 항목). printenv VAR적어도 GNU 구현의 경우 모두 표시합니다.
Stéphane Chazelas


5

모든 프로세스에는 고유 한 환경 변수 세트가 있음을 이해해야합니다.

프로세스가 fork()시스템 호출을 호출 하면 첫 번째 ( 부모 )와 동일한 두 번째 프로세스 ( 자식 ) 가 작성됩니다 (이 사본 에는 스택의 생각에 따라 스택 바로 위 또는 아래에있는 환경 이 포함됨 - 하지만 유닉스 / 리눅스 스택 성장 다운 ) 높은 주소에서.:-)

일반적으로 자식 프로세스는 execve()시스템 호출 을 호출하여 (가상) 메모리의 모든 것을 버리고 지정된 이진 파일의 코드 및 데이터 섹션에서이를 재구성 합니다.

그러나 스택을 재구성 할 때 함수 execve()를 호출하기 전에 스택에 전달 된 환경 및 인수 문자열을 먼저 (순서대로) 복사 합니다 (복귀 후 항목에main() 대한 많은 작업이 crt0부트 스트랩 코드 에서 수행됩니다) 바이너리에 지정된 )).execve()

execve()C 라이브러리에는 호출자를 제공하는 대신 현재 환경 (예 : 상위 환경의 사본)을 전달 하는 시스템 호출에 대한 랩퍼가 있습니다 (실제로 하위 환경이 상위 환경을 상속 함 )-참조 environ(7).

(루트로) 명령을 실행 해보십시오 ps axeww | less... 그러면 모든 프로세스 의 환경이 표시 됩니다! 흥미로운 것은 프로세스 ID 1입니다 (즉, init프로세스-부팅시 커널이 만든 첫 번째 프로세스).

특정 프로세스에 대한 환경을보고 프로세스 ID를 알고있는 경우 명령을 실행하십시오 cat /proc/<PID>/environ( <PID>프로세스 ID로 대체 ).

프로세스에 충분한 권한이있는 경우 자체 스택을 다시 작성할 수 있으므로 환경이 무엇인지 알기가 어려워 질 수 있습니다. ps 출력에 이와 같은 데몬 프로세스가 표시됩니다.

그냥 (내장) 명령을 사용하여 쉘 프로세스의 특정 환경 변수의 현재 값을보고 싶다면 결국,이 모든 와플, @chaos 위의 말에 귀결 echo "$<NAME>"교체 ( <NAME>의 이름으로 다른 환경에서 동일한 변수가 다른 값을 가질 수도 있고 전혀 존재하지 않을 수도 있습니다.


1
(1)에 대한 e옵션 ps/proc/…/environ특수 파일이 모든 시스템에 존재하지 않을 수도 있습니다. (2) AFAIK, 모든 Unix 프로세스는 스택을 다시 작성하고 환경 변수를 수정할 수있는 권한이 있습니다. (3) 자세한 내용 은 환경 변수가 누구에게 속하는가?를 참조하십시오 . ( 수퍼 유저 ).
G-Man, 'Reinstate

일부 시스템에는 권한이없는 프로세스가 명령 줄 인수와 환경을 "숨기는" "루트 실행"을 막을 수있는 방법이 있다고 생각했습니다 ps. 그러나 이제이 점을 강조 했으므로 생각했다.
머레이 젠슨

@MurrayJensen은 ps에서 인수를 숨기는 "curl"에 대해 질문 한 투표에 대한 일부 토론에 따르면 POSs에서는 ps가 원래 프로세스에 전달 된대로 인수를 리턴하는지 아니면 프로세스가 프로세스 이후에 수정 한 사본을 리턴하는지 여부를 지정하지 않았습니다. 시작했다. 어떤 시스템 (Solaris ??)은 원래의 인수를 보여줍니다. (여기 링크가 있습니다.) 이것은 당신이 생각한 것일 수 있습니다. :)
와일드 카드

빙고! 그렇습니다. 물론 솔라리스는 이것을 "정확하게"합니다 :-) 리프레셔에 감사드립니다 ...
Murray Jensen

1

당신이 찾고있는 것을 얻을 수 있습니다 export:

export | grep HOME

$HOME변수 의 내용을 보여줍니다 .


1

많은 변수를 설정 해야하는 경우 :

  ( set -o posix ; set ) | sort >~/vars.before

설정 한 후 :

  ( set -o posix ; set ) | sort >~/vars.after

설정된 것을 표시하는 것보다 :

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

이런 식으로 cnf 파일에 미리 정의 된 여러 셸 변수 세트를 사용하여 작업을 곧 찾을 수 있습니다. tmux와 결합하면 셸 환경에서 구성 관리 마스터가됩니다.

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.