환경 변수의 현재 값을 표시하는 방법? 확인할 때 많은 환경 변수가 나타납니다. 특정

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

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

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

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



답변

다만:

echo "$VARIABLENAME"

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

echo "$HOME"

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

/home/username

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

printenv HOME

답변

실행하여 :

printenv

모든 환경 변수가 표시됩니다. 자세한 정보는 다음을 참조하십시오.

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps


답변

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

프로세스가 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>의 이름으로 다른 환경에서 동일한 변수가 다른 값을 가질 수도 있고 전혀 존재하지 않을 수도 있습니다.


답변

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

export | grep HOME

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


답변

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

  ( 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 $_ "'
  }