나는 이것이 VARIABLE=value
환경 변수를 생성하고 export VARIABLE=value
현재 쉘에서 생성된 프로세스에서 사용할 수 있게 한다는 것을 알고 있습니다. env
현재 환경 변수를 표시하지만 해당 변수는 어디에 있습니까? 환경 변수(또는환경, 이 질문에 대해)?
답변1
환경은 보이는 것만큼 마술적이지 않습니다. 쉘은 이를 메모리에 저장하고 execve()
시스템 호출에 전달합니다. 하위 프로세스는 이를 배열 포인터로 상속합니다 environ
. execve
맨페이지 에서 :
요약
#include <unistd.h> int execve(const char *filename, char *const argv[], char *const envp[]);
argv
새 프로그램에 전달되는 매개변수 문자열의 배열입니다.
관례적으로 이러한 문자열 중 첫 번째에는 실행 중인 파일과 관련된 파일 이름이 포함되어야 합니다.envp
일반적으로 키=값 형식의 문자열 배열이며 새 프로그램에 환경으로 전달됩니다.
맨페이지는 environ(7)
또한 몇 가지 통찰력을 제공합니다.
요약
extern char **environ;
설명하다
이 변수는
environ
"environment"라는 문자열 포인터 배열을 가리킵니다. 배열의 마지막 포인터 값은 입니다NULL
. (이 변수는 사용자 프로그램에서 선언해야 하지만 헤더가 libc4 또는 libc5에서 온 경우, 그리고 glibc에서 왔으며 _GNU_SOURCE가 정의된 경우 헤더에 선언됩니다<unistd.h>
.) 이 문자열 배열은 process (3) 프로세스를 실행하기 위해 호출됩니다.
두 GNU 매뉴얼 페이지는 모두 다음과 관련되어 있습니다.POSIX 사양
답변2
뭔가 잘못하고 있습니다. SOME_NAME=value
쉘 변수를 생성하는 것입니다(대부분의 쉘에서). export SOME_NAME=value
환경 변수를 만듭니다. 좋든 나쁘든 대부분의 Unix/Linux/*BSD 쉘은 환경 변수와 쉘 변수에 액세스할 때 동일한 구문을 사용합니다.
더 큰 의미에서 "환경"은 단순히 프로그램 실행에 수반되는 정보입니다. C 프로그램에서는 를 호출하여 프로세스 ID를 찾을 수 있으며 getpid()
, 쉘 프로그램에서는 변수 access: 를 사용합니다 $$
. 프로세스 ID는 프로그램 환경의 일부일 뿐입니다. 나는 "환경"이라는 용어가 프로그램 실행 모델링과 같은 좀 더 이론적인 컴퓨터 과학 주제에서 유래했다고 믿습니다. 프로그램 실행 모델에는환경"변수와 그 값 사이의 연관성을 포함합니다."
후자에 대한 보다 강력한 정의는 Unix/Linux/*BSD 쉘의 "환경", 즉 이름("변수")과 그 값 사이의 연관입니다. 대부분의 Unix 스타일 쉘의 경우 이러한 값은 문자열이지만 이전만큼 엄격하지는 않습니다. 오늘날 Ksh, Zsh 및 Bash에는 모두 유형 변수가 있습니다. 쉘 함수 정의를 내보내는 것도 가능합니다.
일반 쉘 변수와 별도의 환경을 사용하려면 fork/exec
모든 Unix가 사용하는 방식으로 새 프로세스를 시작해야 합니다. 이름/값 쌍을 사용하면 이름/값 쌍은 시스템 호출( 셸 명령을 사용 하지 않는 한 일반적으로 나중)을 통해 셸에서 실행되는 export
새 실행 파일의 환경에 나타납니다 .execve(2)
fork(2)
exec
이면에는 execve()
새로운 main()
바이너리 함수에 명령줄 인수인 환경(NULL로 끝나는 문자열 포인터 배열로 저장됨 var=value
, environ(7)
매뉴얼 페이지 참조)이 있습니다. 상속된 다른 상태에는 ulimit
설정, 현재 작업 디렉터리 및 execve()
호출자가 FD_CLOEXEC를 설정하지 않은 열린 파일 설명자가 포함됩니다. tty의 현재 상태(에코 활성화, 원시 모드 등)도 exec
새 프로세스에 의해 상속된 실행 상태의 일부로 간주될 수 있습니다.
bash
지침은 설명서를 참조하세요 .실행 환경간단한 명령용(내장 또는 쉘 기능 제외).
Unix 환경은 적어도 일부 다른 운영 체제와 다릅니다. VMS "어휘"는 하위 프로세스에 의해 변경될 수 있으며 변경 사항은 상위 프로세스에서 볼 수 있습니다. 하위 프로세스의 VMS는 cd
상위 프로세스의 작업 디렉터리에 영향을 미칩니다. 적어도 어떤 경우에는 내 기억력이 손상될 수 있습니다.
일부 환경 변수는 , 등이 잘 $HOME
알려져 있습니다 $PATH
. $LD_LIBRARY_PATH
일부는 특정 프로그래밍 시스템에 대한 일반 정보이므로 상위 쉘은 특정 임시 디렉토리와 같은 특정 프로그램에 많은 특수 목적 정보를 전달하거나 ps -ef
. 웹 서버는 환경 변수를 통해 많은 정보를 얻습니다.
답변3
가장 원시적인 형태의 환경 변수는 단순히 이름/값 쌍의 집합입니다. Bash 매뉴얼 페이지( man 1 bash
) 의 ENVIRONMENT 섹션에 명시된 대로 :
When a program is invoked it is given an array of strings called the
environment. This is a list of name-value pairs, of the form
name=value.
The shell provides several ways to manipulate the environment. On
invocation, the shell scans its own environment and creates a parameter
for each name found, automatically marking it for export to child pro-
cesses. Executed commands inherit the environment.
실제로 이를 통해 현재 셸에서 호출된 프로그램에 대해 공유되거나 고유한 동작을 정의할 수 있습니다. 예를 들어, crontab
또는 를 사용할 때 환경 변수를 정의하여 시스템에서 기본적으로 사용하는 편집기가 아닌 다른 편집기를 정의 visudo
할 수 있습니다 . 매뉴얼 페이지 출력을 표시하는 데 사용해야 하는 호출기를 찾기 위해 환경을 조사하는 것과 EDITOR
같은 명령의 경우에도 마찬가지입니다.man
PAGER
많은 유닉스 명령은 환경을 읽고 설정된 내용에 따라 출력/처리/작업을 변경합니다. 일부는 공유되고 일부는 프로그램에 고유합니다. 대부분의 매뉴얼 페이지에는 환경 변수가 설명하는 프로그램에 어떤 영향을 미치는지에 대한 정보가 포함되어 있습니다.
다른 실제적인 예는 동일한 플랫폼에 여러 Oracle이 설치된 시스템과 같은 상황에 적용됩니다. 설정을 사용하면 ORACLE_HOME
전체 Oracle 명령 세트( PATH
환경 변수에서 로드됨)가 이 최상위 디렉토리에서 설정, 정의, 매핑 및 라이브러리를 추출합니다. Java 및 해당 JAVA_HOME
환경 변수 와 같은 다른 프로그램에서도 마찬가지입니다.
HISTSIZE
Bash 자체에는 기록( 등 HISTFILE
), 화면 크기( COLUMNS
), 탭 완성( FIGNORE
, GLOBIGNORE
) 로케일 및 문자 인코딩/디코딩( LANG
, LC_*
), 프롬프트( PS1
.. )를 포함하여 다양한 동작을 변경할 수 있는 여러 환경 변수가 있습니다. PS4
) 등(다시 bash 매뉴얼 페이지에서 지식을 구합니다).
또한 사용자 정의 환경 변수를 사용하는 스크립트/프로그램을 작성할 수도 있습니다(설정 전달 또는 기능 변경).
답변4
"환경 변수"실행 중인 프로세스가 컴퓨터에서 작동하는 방식에 영향을 줄 수 있는 동적으로 명명된 값 집합입니다.
이는 프로세스가 실행되는 운영 환경의 일부입니다. 예를 들어, 실행 중인 프로세스는 TEMP 환경 변수 값을 쿼리하여 임시 파일을 저장할 적절한 위치를 찾거나 HOME 또는 USERPROFILE 변수를 쿼리하여 프로세스를 실행하는 사용자가 소유한 디렉터리 구조를 찾을 수 있습니다.
자세한 내용은 여기를 클릭하세요 →http://en.wikipedia.org/wiki/Environment_variable.
환경변수에 대해 알고 싶은 모든 것... ↑