시스템 환경을 확인해보니 환경변수가 많이 나오네요. 특정 변수를 검색하려면 어떻게 해야 합니까?
내가 읽고 있는 책에는 이런 말이 있다.
때로는 환경의 변수 수가 너무 많아서 하나의 값에만 관심이 있을 때 표시되는 모든 값을 보고 싶지 않을 때가 있습니다. 이 경우 이
echo
명령을 사용하여 환경 변수의 현재 값을 표시할 수 있습니다.
Linux 터미널에서 이 작업을 수행하는 방법은 무엇입니까?
답변1
오직:
echo "$VARIABLENAME"
예를 들어 환경 변수의 경우 다음을 $HOME
사용합니다.
echo "$HOME"
그런 다음 다음과 같이 인쇄하십시오.
/home/username
편집하다: 에 따르면댓글: Stéphane Chazelasprintenv
, 대신 사용하면 echo
더 좋을 수 있습니다 .
printenv HOME
답변2
다음을 실행하여:
printenv
모든 환경 변수가 표시됩니다. 자세한 내용은 다음을 확인하세요.
답변3
각 프로세스에는 고유한 환경 변수 세트가 있다는 점을 이해하는 것이 중요합니다.
한 프로세스가 fork()
시스템 호출을 호출하면 두 번째 프로세스(어린이)와 첫 번째 (부모)이 생성됩니다(이복사스택을 보는 방법에 따라 바로 위(또는 아래)에 있는 환경을 포함 :-)
하지만 unix/linux에서는 스택이 커집니다.아래에높은 주소에서).
execve()
일반적으로 하위 프로세스는 시스템 호출을 호출하여 (가상) 메모리에 있는 모든 것을 삭제하고재건이는 지정된 바이너리의 코드 및 데이터 섹션에서 나옵니다.
그러나 그럴 때재건함수를 호출하기 전에 먼저 execve()
스택에 전달된 환경 및 매개변수 문자열을 해당 순서대로 복사합니다 (return 후 부트스트래핑 코드에서 main()
많은 작업이 수행됩니다 ).crt0
execve()
진입 지점바이너리 파일에 지정됨)).
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 $_ "'
}