환경 변수는 실행 중인 프로세스가 컴퓨터에서 동작하는 방법에 영향을 줄 수 있는 동적-이름 값입니다. 그것들은 프로세스가 실행하는 환경의 일부입니다. 예를 들어, 실행 중인 프로세스는 TEMP 환경 변수의 값을 임시 파일을 저장할 적절한 위치를 검색하기 위해 질의하거나, HOME 또는 USERPROFILE 변수를 프로세스를 실행하는 사용자에 의해 소유된 디렉토리 구조를 찾기 위해 질의될 수 있습니다.
그것들은 1979년에 버전 7 유닉스와 함께 현대적인 형식으로 도입되었으므로, 리눅스와 macOS를 포함하여 그 이후의 모든 유닉스 운영 시스템과 변종에 포함됩니다. 1982년 PC DOS 2.0부터, Microsoft Windows와 OS/2를 포함한 모든 후속 Microsoft 운영 시스템은 역시 그것들을 기능으로 포함했지만, 구문, 사용법 및 표준 변수 이름은 약간 다릅니다.
Design
모든 유닉스와 유닉스-계열 시스템과 마찬가지로 윈도우에서, 각 프로세스는 고유한 별도의 환경 변수의 집합을 가집니다. 기본적으로, 프로세스가 만들어질 때, 그것이 자식을 만들 때 부모에 의해 명시적으로 변경한 사항을 제외하고는 부모 프로세스의 중복 런타임 환경을 상속합니다. API 수준에서, 이들 변경은 fork와 exec를 실행하는 사이에 수행되어야 합니다. 대안적으로, bash와 같은 명령 쉘에서, 사용자는 env를 통해 간접적으로 호출하거나, ENVIRONMENT_VARIABLE=VALUE <command> 표기법을 사용함으로써 특정 명령 호출에 대해 환경 변수를 변경할 수 있습니다. 실행 중인 프로그램은 구성을 위해 환경 변수의 값에 접근할 수 있습니다.
쉘 스크립트와 배치 파일은 환경 변수를 데이터와 기본 설정을 자식 프로세스에 전달하기 위해 사용합니다. 그것들은 역시 나중에 쉘 스크립트에서 참조에 대해 임시 값을 저장하기 위해 사용될 수 있습니다. 어쨌든, 유닉스에서, 변수가 프로세스 외부로 누출되지 않기 때문에 내보내지 않은 변수가 선호됩니다.
유닉스에서, 스크립트 또는 컴파일된 프로그램에서 변경된 환경 변수는 해당 프로세스와 가능한 자식 프로세스에만 영향을 미칠 것입니다. 부모 프로세스와 임의의 관련되지 않은 프로세스는 영향을 받지 않을 것입니다. 유사하게, DOS 배치 파일 내에서 변수 값을 변경하거나 제거하면 COMMAND.COM의 존재하는 동안 변수를 변경할 것입니다.
유닉스에서, 환경 변수는 통상적으로 시스템 시작 중에 시스템 초기화 시작 스크립트에 의해 초기화되고, 따라서 시스템에서 다른 모든 프로세스에 상속됩니다. 사용자는 사용 중인 명령 쉘에 대해 프로필 스크립트에서 변수를 보강할 수 있고, 종종 그렇게 합니다. Microsoft Windows에서, 각 환경 변수의 기본값은 Windows 레지스트리에 저장되거나 AUTOEXEC.BAT 파일에 설정됩니다.
유닉스에서, setuid 프로그램은 호출자에 의해 선택된 환경을 제공하지만, 그것은 호출자와 다른 권한으로 실행됩니다. 동적 링커는 보통 환경 변수 $LD_LIBRARY_PATH와 $LD_PRELOAD에 의해 지정된 위치에서 코드를 로드하고 그것을 프로세스의 권한으로 실행할 것입니다. 만약 setuid 프로그램이 이 작업을 했으면, 호출자가 임의의 코드를 실행하고 따라서 권한을 오용할 수 있기 때문에 안전하지 않습니다. 이러한 이유로, libc는 setuid 프로세스에서 시작할 때 이들 환경 변수를 설정 해제합니다. setuid 프로그램은 보통 미지수 환경 변수를 설정 해제하고 다른 환경 변수를 확인하거나 합리적인 값으로 설정합니다.
일반적으로, 환경 변수의 모음은 키와 값 둘 다는 문자열인 연관 배열로 기능합니다. 두 문자열의 문자 해석은 시스템마다 다릅니다. 목록과 같은 데이터 구조는 표현되어야 할 때, 콜론 (유닉스와 유닉스-계열에서 공통) 또는 세미콜론으로-구분된 (Windows 및 DOS에서 공통) 목록을 사용하는 것이 공통적입니다.
Syntax
변수는 스크립트와 명령줄 모두에서 사용될 수 있습니다. 그것들은 보통 변수 이름 앞이나 주위에 특수 기호를 넣음으로써 참조됩니다.
환경 변수 이름에 대해 모두 대문자로 선택하는 것이 관례적입니다. 일반적으로 프로그래밍 코드에서, 이것은 환경 변수를 코드에서 다른 종류의 이름과 구별하기 위해 도움이 됩니다. 유닉스-계열 운영 시스템에서, 환경 변수 이름은 대소문자를 구분하지만, 그것들은 DOS, OS/2 및 Windows에서는 그렇지 않습니다.
Unix
대부분의 유닉스와 유닉스-계열 명령줄 쉘에서, 환경 변수의 값은 변수 이름 앞에 $ 기호를 배치함으로써 검색됩니다. 만약 필요하면, 그 이름은 중괄호로 묶일 수도 있습니다.
사용자 홈 디렉토리를 표시하기 위해, 사용자는 다음을 입력할 수 있습니다:
echo $HOME
만약 xyz가 HOME 변수 값에 덧붙여지게 될 필요가 있으면, 다음을 입력할 수 있습니다:
echo ${HOME}xyz
유닉스와 유닉스-계열 시스템에서, 환경 변수의 이름은 대소문자를 구별합니다.
명령 env는 모든 환경 변수와 해당하는 값을 표시합니다. 명령 printenv은 해당 변수 이름을 명령에 대한 단 하나의 인수를 지정함으로써 단일 변수를 인쇄하기 위해 사용될 수도 있습니다.
Assignment: Unix
명령 env와 set은 환경 변수를 설정하기 위해 사용될 수 있고 종종 쉘에 직접 통합됩니다.
다음 명령도 사용될 수 있지만, 특정 쉘에 종속됩니다.
VARIABLE=value #
export VARIABLE # Bourne와 관련된 쉘에 대해
export VARIABLE=value # ksh, bash, 및 관련된 쉘에 대해
setenv VARIABLE value # csh와 관련된 쉘에 대해
몇 가지 간단한 원칙은 환경 변수가 효과를 달성하는 방법을 통제합니다.
환경 변수는 그것들이 설정된 프로세스에 대해 지역적입니다. 만약 두 개의 셸 프로세스가 생성되고 환경 변수 값이 하나에서 변경되면, 해당 변경 사항은 다른 프로세스에 의해 볼 수 없을 것입니다.
자식 프로세스가 생성될 때, 그것은 부모 프로세스로부터 모든 환경 변수와 해당 값을 상속합니다. 보통, 프로그램이 또 다른 프로그램을 호출할 때, 그것은 먼저 포킹에 의해 자식 프로세스를 만들고, 그런-다음 자식이 필요에 따라 환경을 조정하고 마지막으로 자식이 호출할 프로그램으로 자신을 교체합니다. 이 프로시저는 호출된 프로그램의 환경에 대한 호출 프로그램 제어를 제공합니다.
유닉스 쉘에서, 변수는 export 키워드없이 할당될 수 있습니다. 이러한 방식으로 정의된 변수는 set 명령에 의해 표시되지만, 쉘에 의해 오직 저장되고 다른 모든 프로세스에는 알려지지 않기 때문에, 실제 환경 변수가 아닙니다. printenv 명령은 그것들을 표시하지 않을 것이고, 자식 프로세스는 그것들을 상속하지 않습니다.
VARIABLE=value
접두사 구문은 현재 프로세스에 영향을 주지 않고 "true" 환경 변수를 자식 프로세스로 내보냅니다:
VARIABLE=value program_name [arguments]
환경 변수의 지속성은 세션-전체 또는 시스템-전체일 수 있습니다.
unset은 유닉스 명령줄 쉘에서 Bourne 쉘 가족 (sh, ksh, bash 등)과 C 쉘 가족 (csh, tcsh 등) 둘 다에 의해 구현된 내장 명령입니다. 그것은 쉘 변수를 설정 해제하며, 메모리와 쉘의 내보내진 환경에서 그것을 제거합니다. 그것이 쉘 내부를 직접 조작하기 때문에 그것은 쉘 내장으로 구현됩니다. 읽기-전용 쉘 변수는 설정 해제될 수 없습니다. 만약 읽기-전용 변수를 설정 해제하려고 시도하면, unset 명령은 오류 메시지를 인쇄하고 비-영 탈출 코드를 반환할 것입니다.
Examples
환경 변수의 예제는 다음과 같습니다:
- PATH: 디렉토리 경로의 목록. 사용자가 전체 경로를 제공하지 않고 명령을 입력할 때, 이 목록은 그것이 명령으로 이어지는 경로를 포함하는 있는지 확인합니다.
- HOME (유닉스-계열) 및 USERPROFILE (Microsoft Windows): 사용자의 홈 디렉토리가 파일 시스템에서 위치되는 곳을 나타냅니다.
- HOME/{.AppName} (유닉스-계열) 및 APPDATA\{DeveloperName\AppName} (Microsoft Windows): 응용 프로그램 설정에 대해, 많은 응용 프로그램이 윈도우에서 응용 프로그램 설정에 USERPROFILE을 잘못 사용합니다: USERPROFILE은 사용자에게 Documents/Pictures/Downloads/Music와 같은 경로 중에서 선택하는 것을 허용하는 대화 상자에서만 사용되어야 합니다; 프로그래밍 목적에 대해, APPDATA (여러 장치에 걸쳐 공유되는 로밍 응용 프로그램 설정에 대해), LOCALAPPDATA (로컬 응용 프로그램 설정에 대해) 또는 PROGRAMDATA (여러 OS 사용자 사이에 공유되는 응용 프로그램 설정에 대해)가 사용되어야 합니다.
- TERM (유닉스-계열): 사용 중인 컴퓨터 터미널 또는 터미널 에뮬레이터의 유형을 지정합니다 (예를 들어, vt100 또는 dumb).
- PS1 (유닉스-계열): Bourne 쉘 및 변종에서 프롬프트가 표시되는 방법을 지정합니다.
- MAIL (유닉스-계열): 사용자의 메일을 찾을 수 있는 위치를 나타내기 위해 사용됩니다.
- TEMP: 프로세스가 임시 파일을 저장할 수 있는 위치입니다.
True environment variables
Unix
- $PATH : 쉘이 그들 이름에 슬래시를 포함하지 않는 명령을 검색하는 콜론-구분된 디렉토리의 목록을 포함합니다 (슬래시를 갖는 명령은 실행할 파일 이름으로 해석되고, 쉘은 파일을 직접 실행하려고 시도합니다). 그것은 DOS, OS/2 and Windows %PATH% 변수와 동일합니다.
- $HOME : 사용자의 홈 디렉토리 위치를 포함합니다. 비록 현재 사용자의 홈 디렉토리는 getpwuid와 getuid C 함수를 통해 찾을 수도 있지만, $HOME은 다양한 쉘 스크립트 (및 기타 컨텍스트)에서 편의상 종종 사용됩니다. 환경 변수를 사용하면 사용자에게 또 다른 디렉토리를 가리킬 가능성을 제공합니다.
- $PWD : 이 변수는 현재 디렉토리를 가리킵니다. 인수 없이 호출될 때 pwd 명령의 출력과 동일합니다.
- $DISPLAY : X11 프로그램이 기본적으로 사용해야 하는 디스플레이에 대해 식별자를 포함합니다.
- $LD_LIBRARY_PATH : 동적 링커를 갖는 많은 유닉스 시스템에서, 동적 링커가 임의의 다른 디렉토리에서 검색하기 전에 exec 후에 프로세스 이미지를 빌드할 때 공유 객체를 검색해야 하는 콜론-구분된 디렉토리 목록을 포함합니다.
- $LIBPATH 또는 $SHLIB_PATH : $LD_LIBRARY_PATH에 대한 대안은 전형적으로 이전 유닉스 버전에서 사용됩니다.
- $LANG, $LC_ALL, $LC_... : $LANG은 기본 로케일을 설정하기 위해 사용됩니다. 예를 들어, 만약 로케일 값이 pt_BR이면, 그 언어는 (브라질) 포르투갈어로 설정되고 브라질 관습이 관련된 곳에서 사용됩니다. 현지화의 다양한 측면은 개별 $LC_-변수 ($LC_CTYPE, $LC_COLLATE, $LC_DATE 등)에 의해 제어됩니다. $LC_ALL은 모든 측면에 대해 같은 로케일을 강제하기 위해 사용될 수 있습니다.
- $TZ : 시간대를 참조합니다. 그것은 시간대 자체를 지정하거나 파일 (/usr/share/zoneinfo에 있음)을 참조하는 여러 형식일 수 있습니다.
- $BROWSER : 사용자에게 URL에서 콘텐츠를 보는 것을 허용할 필요가 있는 프로그램에서 사용하기 위해, 콜론-구분된 사용자 웹 브라우저 기본 설정 목록을 포함합니다. 그 목록에 있는 브라우저는 처음부터 끝까지 시도되도록 의도되어 있으며, 성공한 첫 번째 브라우저 이후에 중지됩니다. 이 배열은 다른 환경에서 대체 동작을 허용하는데, 예를 들어, X11 환경에서 그래픽 브라우저 (예를 들어, Firefox)를 사용할 수 있지만, 콘솔 환경에서 터미널-기반 브라우저 (예를 들어, Lynx)를 사용할 수 있습니다. %s토큰이 URL이 배치되어야 하는 곳을 지정하기 위해 제공될 수 있습니다; 그렇지 않으면 그 브라우저는 첫 번째 인수로 URL과 함께 시작되어야 합니다.
Further reading
- Chen, Raymond (2010-05-06). "What are these strange =C: environment variables?". The New Old Thing. Microsoft. Archived from the original on 2018-05-27. Retrieved 2017-05-27.
External links
- environ(7): user environment – Linux Programmer's Manual – Overview, Conventions and Miscellanea
- environ(7) – FreeBSD Miscellaneous Information Manual
- environ(7) – Darwin and macOS Miscellaneous Information Manual
- environ(5) – Solaris 10 Standards, Environments and Macros Reference Manual
- Environment Variables Wiki
- User Environment Variables
- fix setx.exe not found bug