시스템 환경을 확인할 때 많은 환경 변수가 나타납니다. 특정 변수를 어떻게 검색 할 수 있습니까?
내가 읽고있는 책은 다음과 같이 말합니다.
때로는 환경의 변수 수가 상당히 커져서 하나에 관심이있을 때 표시된 모든 값을보고 싶지 않습니다. 이 경우
echo
명령을 사용하여 환경 변수의 현재 값을 표시 할 수 있습니다 .
Linux 터미널에서 어떻게합니까?
시스템 환경을 확인할 때 많은 환경 변수가 나타납니다. 특정 변수를 어떻게 검색 할 수 있습니까?
내가 읽고있는 책은 다음과 같이 말합니다.
때로는 환경의 변수 수가 상당히 커져서 하나에 관심이있을 때 표시된 모든 값을보고 싶지 않습니다. 이 경우
echo
명령을 사용하여 환경 변수의 현재 값을 표시 할 수 있습니다 .
Linux 터미널에서 어떻게합니까?
답변:
다만:
echo "$VARIABLENAME"
예를 들어 환경 변수의 $HOME
경우 다음을 사용하십시오.
echo "$HOME"
그런 다음 비슷한 것을 인쇄합니다.
/home/username
편집 : Stéphane Chazelas 의 의견에 따르면 다음 printenv
대신에 사용 하는 것이 좋습니다 echo
.
printenv HOME
printenv VAR
적어도 GNU 구현의 경우 모두 표시합니다.
실행하여 :
printenv
모든 환경 변수가 표시됩니다. 자세한 정보는 다음을 참조하십시오.
printenv
variablename
위해 명명 된 변수 만 표시합니다. 예 printenv HOME
를 들어와 거의 같은 작업을 수행 echo "$HOME"
합니다.
모든 프로세스에는 고유 한 환경 변수 세트가 있음을 이해해야합니다.
프로세스가 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>
의 이름으로 다른 환경에서 동일한 변수가 다른 값을 가질 수도 있고 전혀 존재하지 않을 수도 있습니다.
e
옵션 ps
과 /proc/…/environ
특수 파일이 모든 시스템에 존재하지 않을 수도 있습니다. (2) AFAIK, 모든 Unix 프로세스는 스택을 다시 작성하고 환경 변수를 수정할 수있는 권한이 있습니다. (3) 자세한 내용 은 환경 변수가 누구에게 속하는가?를 참조하십시오 . ( 수퍼 유저 ).
ps
. 그러나 이제이 점을 강조 했으므로 생각했다.
당신이 찾고있는 것을 얻을 수 있습니다 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 $_ "'
}
echo
변수의 내용을 변형시킬 수 있으므로 명령을 잘못 선택합니다. 쉘 매개 변수의 내용을 동일한 이름으로 출력합니다. 즉, Bourne 쉘을 사용하는 경우 반드시 동일하지 나 ENV에 대해 같은 바르1
,*
예를 들면. 그리고 이름이 쉘 변수 이름으로 유효하지 않은 env vars에는이 방법을 사용할 수 없습니다.