환경 변수란 정확히 무엇입니까?

환경 변수란 정확히 무엇입니까?

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새로운 프로그램에 환경으로 전달되는 일반적으로 key=value 형식의 문자열 배열입니다.

environ(7)페이지는 또한 몇 가지 통찰력을 제공합니다.

개요

   extern char **environ;

설명

변수는 environ"환경"이라는 문자열에 대한 포인터 배열을 가리킵니다. 이 배열의 마지막 포인터 값은 입니다 NULL. (이 변수는 사용자 프로그램에서 선언해야 하지만 헤더 <unistd.h>파일이 libc4 또는 libc5에서 온 경우와 glibc에서 왔고 _GNU_SOURCE가 정의된 경우 헤더 파일에 선언됩니다.) 이 문자열 배열은 다음에서 사용할 수 있습니다. 프로세스를 시작한 exec(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모든 유닉스가 사용하는 새로운 프로세스를 시작하는 방법을 포함합니다. 이름/값 쌍을 사용하면 해당 이름/값 쌍은 시스템 호출(일반적으로 셸 명령이 사용된 경우를 제외하고 일반적으로 다음) export을 사용하여 셸에서 시작되는 새 실행 파일 환경에 존재하게 됩니다 .execve(2)fork(2)exec

에 이어 새 바이너리의 execve()함수 main()에는 명령줄 인수인 환경( var=value문자열에 대한 NULL로 끝나는 포인터 배열로 저장됨, environ(7)매뉴얼 페이지 참조)이 있습니다. 상속되는 다른 상태에는 설정, 현재 작업 디렉터리 및 호출자가 FD_CLOEXEC를 설정하지 않은 ulimit열려 있는 파일 설명자가 포함됩니다. execve()tty의 현재 상태(에코 활성화, 원시 모드 등)는 새로 exec생성된 프로세스에 의해 상속된 실행 상태의 일부로 간주될 수도 있습니다.

bash설명서의 설명을 참고하세요실행 환경간단한 명령용(내장 또는 쉘 기능 제외).

Unix 환경은 적어도 일부 다른 운영 체제와 다릅니다. VMS "어휘"는 하위 프로세스에 의해 변경될 수 있으며 해당 변경 사항은 상위 프로세스에서 볼 수 있습니다. 하위 프로세스의 VMS는 cd상위 프로세스의 작업 디렉터리에 영향을 미칩니다. 적어도 어떤 상황에서는 내 기억이 나에게 실패할 수도 있습니다.

일부 환경 변수는 잘 알려져 있습니다. $HOME, 및 기타. 일부는 특정 프로그래밍 시스템에 일반적이므로 상위 셸은 특정 임시 디렉터리나 . 예를 들어 간단한 CGI 프로그램은 환경 변수를 통해 웹 서버로부터 많은 정보를 상속받습니다.$PATH$LD_LIBRARY_PATHps -ef

답변3

가장 원시적인 형태의 환경 변수는 이름/값 쌍의 집합일 뿐입니다. man 1 bashENVIRONMENT 섹션 아래 bash 매뉴얼 페이지( )에 설명된 대로 :

   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_HOME환경 변수 가 있는 Java와 같은 다른 프로그램에서도 마찬가지입니다 .

HISTSIZEBash 자체에는 기록( , HISTFILE등), 화면 크기( COLUMNS), 탭 완성( FIGNORE, GLOBIGNORE) 로케일 및 문자 인코딩/디코딩( LANG, LC_*), 프롬프트( PS1.. PS4) 및 등 다양한 동작을 변경할 수 있는 많은 환경 변수가 있습니다. 등등 (다시 bash 매뉴얼 페이지에서 지식을 찾으십시오).

또한 사용자 정의 환경 변수를 사용하는 스크립트/프로그램을 작성할 수 있습니다(설정 전달 또는 기능 변경).

답변4

"환경 변수"실행 중인 프로세스가 컴퓨터에서 작동하는 방식에 영향을 줄 수 있는 동적 명명된 값 집합입니다.

이는 프로세스가 실행되는 운영 환경의 일부입니다. 예를 들어, 실행 중인 프로세스는 TEMP 환경 변수의 값을 쿼리하여 임시 파일을 저장할 적절한 위치를 찾거나, HOME 또는 USERPROFILE 변수를 쿼리하여 프로세스를 실행하는 사용자가 소유한 디렉터리 구조를 찾을 수 있습니다.

자세한 내용은 여기 →http://en.wikipedia.org/wiki/Environment_variable.

환경변수에 대해 알고 싶은 모든 것... ↑

관련 정보