환경 변수의 현재 값을 표시하는 방법은 무엇입니까?

환경 변수의 현재 값을 표시하는 방법은 무엇입니까?

시스템 환경을 확인해보니 환경변수가 많이 나오네요. 특정 변수를 검색하려면 어떻게 해야 합니까?

내가 읽고 있는 책에는 이런 말이 있다.

때로는 환경의 변수 수가 너무 많아서 하나의 값에만 관심이 있을 때 표시되는 모든 값을 보고 싶지 않을 때가 있습니다. 이 경우 이 echo명령을 사용하여 환경 변수의 현재 값을 표시할 수 있습니다.

Linux 터미널에서 이 작업을 수행하는 방법은 무엇입니까?

답변1

오직:

echo "$VARIABLENAME"

예를 들어 환경 변수의 경우 다음을 $HOME사용합니다.

echo "$HOME"

그런 다음 다음과 같이 인쇄하십시오.

/home/username

편집하다: 에 따르면댓글: Stéphane Chazelasprintenv, 대신 사용하면 echo더 좋을 수 있습니다 .

printenv HOME

답변2

다음을 실행하여:

printenv

모든 환경 변수가 표시됩니다. 자세한 내용은 다음을 확인하세요.

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

답변3

각 프로세스에는 고유한 환경 변수 세트가 있다는 점을 이해하는 것이 중요합니다.

한 프로세스가 fork()시스템 호출을 호출하면 두 번째 프로세스(어린이)와 첫 번째 (부모)이 생성됩니다(이복사스택을 보는 방법에 따라 바로 위(또는 아래)에 있는 환경을 포함 :-)하지만 unix/linux에서는 스택이 커집니다.아래에높은 주소에서).

execve()일반적으로 하위 프로세스는 시스템 호출을 호출하여 (가상) 메모리에 있는 모든 것을 삭제하고재건이는 지정된 바이너리의 코드 및 데이터 섹션에서 나옵니다.

그러나 그럴 때재건함수를 호출하기 전에 먼저 execve()스택에 전달된 환경 및 매개변수 문자열을 해당 순서대로 복사합니다 (return 후 부트스트래핑 코드에서 main()많은 작업이 수행됩니다 ).crt0execve()진입 지점바이너리 파일에 지정됨)).

C 라이브러리에는 호출자가 제공하는 대신 현재 환경(즉, 상위 환경의 복사본)을 전달하는 execve()시스템 호출용 래퍼가 있습니다.상속하다부모 환경) - 참조하세요 environ(7).

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

특정 프로세스의 환경을 확인하고 프로세스 ID를 알고 싶다면 이 명령을 실행해 보세요 cat /proc/<PID>/environ( <PID>프로세스 ID로 대체).

프로세스에 충분한 권한이 있는 경우 자체 스택을 다시 작성할 수 있으므로 해당 환경이 무엇인지 파악하기 어려울 수 있습니다. ps 출력에서 ​​이와 같은 일부 데몬을 볼 수 있습니다.

그러나 결국 이 모든 말도 안되는 소리는 @chaos가 위에서 말한 것으로 귀결됩니다. 쉘 프로세스에서 특정 환경 변수의 현재 값을 보려면 (내장) 명령을 사용하십시오 echo "$<NAME>"( <NAME>환경 변수로 바꾸십시오) 관심이 있으신가요?)... 동일한 변수가 다른 프로세스에서는 다른 값을 가질 수도 있고 전혀 존재하지 않을 수도 있습니다.

답변4

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

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

관련 정보