sh , ls , cat 과 같은 명령어들은 사실 /bin 과 같은 폴더에 있는 ELF 프로그램들이다.
사용자가 해당 명령을 입력하면 셸은 사용자가 입력한 프로그램을 찾은 후 실행한다.
사용자가 /bin/sh 와 같이 엄밀한 경로를 지정해주지 않고 sh 와 같이 단순하게 프로그램명을 입력하더라도 셸이 올바른 프로그램을 찾을 수 있는 이유는 환경 변수 덕분이다.
**환경 변수(Environment Variable)**는 컴퓨터에서 실행 중인 프로세스의 동작 방식에 영향을 미치는 값이며 사용자가 임의로 정의할 수 있다. 환경 변수는 일반적으로 키-값(Key-Value) 쌍의 형태로 구성되며, 시스템 및 프로그램의 설정이나 동작에 필요한 정보를 전달하는 데 사용된다.
특정 디렉터리 경로, 사용자 이름, 시스템 환경 설정, 또는 응용 프로그램이 참조할 API 키 등을 환경 변수로 지정할 수 있다.
리눅스에서 사용하는 대표적인 환경 변수 키 값은 다음과 같다.
| 환경 변수 | 역할 |
|---|---|
| PATH | 실행 파일 탐색 경로 집합 |
| HOME | 사용자의 홈 디렉터리 |
| LANG | 터미널에서 기본적으로 지원할 언어 |
| PWD | 사용자의 현재 작업 디렉터리 경로 |
| USER | 사용자 이름 |
| SHELL | 로그인 셸 종류 |
| 메일 보관 경로 | |
| UID | 사용자의 UID |
| LS_COLORS | ls 명령어 사용 시 출력되는 색상 옵션의 경로 |
터미널에서 sh 만 입력해도 /bin/sh 가 실행되는 이유는 PATH 환경 변수에 /bin 이 포함되어 있기 때문이다. 만약 터미널에 명령어가 입력되는 경우(e.g. cat ) 셸은 PATH의 맨 앞 폴더부터 시작해 해당 폴더에 사용자가 요청한 프로그램이 있는지 확인한다. 만약 있다면 해당 프로그램을 실행한다.
env는 environ의 약자로 현재 환경 변수를 출력하거나 새로운 환경 변수를 설정한 후, 해당 환경 변수로 프로그램을 실행하는데 사용한다.
env [옵션] [NAME=VALUE(환경 변수)] [명령어] 으로 사용하며 옵션은 다음과 같다.
| 옵션 | 기능 |
|---|---|
| -i | 현재 환경 변수 설정을 모두 무시하고 지정한 환경 변수 값을 따름 |
| -u | 지정된 변수의 설정 값 해제 |
env 만 사용할 경우 설정된 환경 변수를 모두 보여준다.
env -i [env1] [env2] ... [env n] [파일 이름] 을 사용할 경우 설정한 환경변수만 사용한다.