셸 변수와 환경 변수
쉽게 말하면
셸 안에 값을 이름 붙여 저장해 둔 것이 변수예요(NAME=kim). 지금 창에서만 쓰는 변수도 있고, export로 내보내면 거기서 새로 실행하는 프로그램도 그 값을 볼 수 있어요(환경 변수). 명령을 어디서 찾을지 적은 PATH가 대표예요.
시험용 정의
셸 변수에는 현재 셸에서만 쓰는 지역 변수와, export로 자식 프로세스에게 전달되는 환경 변수가 있다. 값은 $이름으로 꺼낸다.
비유로 이해하기
지역 변수는 내 방 메모장, 환경 변수는 가족 모두가 보는 냉장고 메모다. 자식(새 프로그램)은 냉장고 메모만 볼 수 있다.
자세히
변수 다루기
| 명령 | 뜻 |
|---|---|
| NAME=kim | 지역 변수 설정 (= 양옆에 공백 없음) |
| echo $NAME | 값 출력 |
| export NAME | 환경 변수로 만들기 |
| export NAME=kim | 설정과 export를 한 번에 |
| unset NAME | 변수 삭제 |
| set | 지역 + 환경 변수 모두(함수 포함) 출력 |
| env · printenv | 환경 변수만 출력 |
| readonly NAME | 읽기 전용으로 |
주요 환경 변수
| 변수 | 뜻 |
|---|---|
| PATH | 명령을 찾을 디렉터리 목록 (콜론 구분) |
| HOME | 홈 디렉터리 |
| USER · LOGNAME | 사용자 이름 |
| SHELL | 로그인 셸 |
| PWD · OLDPWD | 현재·이전 디렉터리 |
| PS1 · PS2 | 기본 프롬프트 · 줄 이어 쓸 때 프롬프트(>) |
| LANG | 언어·문자 인코딩 (ko_KR.UTF-8) |
| HISTSIZE · HISTFILE | 히스토리 개수 · 저장 파일 |
| TERM | 터미널 종류 |
| HOSTNAME | 호스트 이름 |
| 메일함 경로 |
특수 변수
| $? | 직전 명령의 종료 상태 (0 성공, 그 외 실패) |
| $$ | 현재 셸의 PID |
| $! | 마지막 백그라운드 작업의 PID |
| $0 | 셸·스크립트 이름 |
| $1 ~ $9 | 위치 매개변수 |
| $# | 매개변수 개수 |
| $* · $@ | 모든 매개변수 |
PATH에 디렉터리 추가
export PATH=$PATH:/opt/app/bin. 기존 값을 앞에 두고 콜론으로 이어 붙인다. 현재 디렉터리의 프로그램은 PATH에 없으므로 ./run.sh처럼 경로를 붙여 실행한다.
시험에 이렇게 나와요
- 셸 변수를 포함해 선언된 변수 전체 확인 →
set, 환경 변수만 →env, 변수 삭제 →unset - 환경 변수 뜻 고르기: SHELL(로그인 셸), USER(사용자 이름), LANG(언어), MAIL(메일함 경로), PS1(기본 프롬프트), PS2(명령행이 이어질 때 보조 프롬프트 >), HISTSIZE(기록 개수)
user=kaitman처럼 변수를 만든 뒤echo "$user"결과 → 변수 값이 나온다(작은따옴표면 글자 그대로 $user)
확인 문제
Q1. 셸에서 NAME=kim을 설정한 뒤 bash로 새 셸(자식)을 열어 echo $NAME을 쳤다. 결과는?
- 오류
- kim
- 빈 줄 (아무것도 안 나옴)
- NAME
정답 보기
3번 빈 줄 (아무것도 안 나옴)
NAME=kim은 지역(셸) 변수라 현재 셸에만 있다. 자식 프로세스에게 물려주려면 export NAME으로 환경 변수로 만들어야 한다.
Q2. 명령을 백슬래시(\)로 다음 줄에 이어 쓸 때 나타나는 > 프롬프트를 정하는 변수는?
- TERM
- PS2
- PS1
- PROMPT_COMMAND
정답 보기
2번 PS2
PS2(보조 프롬프트)다. 기본값이 > 다. PS1은 평소의 주 프롬프트다.
Q3. 현재 시스템의 언어·문자 인코딩 설정을 담은 환경 변수는?
- HOME
- TERM
- LANG
정답 보기
4번 LANG
LANG(예: ko_KR.UTF-8).
Q4. 직전에 실행한 명령의 종료 상태 값을 담은 변수는?
- $!
- $?
- $#
- $$
정답 보기
2번 $?
$?다. 0이면 성공, 0이 아니면 실패다. $$는 현재 셸의 PID, $!는 마지막 백그라운드 PID, $#은 인자 개수다.
Q5. 환경 변수만 출력하는 명령이 아닌 것은?
- printenv
- set
- export (인자 없이)
- env
정답 보기
2번 set
set은 지역 변수까지 모두 출력.
Q6. 기본 프롬프트 모양을 정하는 변수는?
- PROMPT
- PS1
- TERM
- PS2
정답 보기
2번 PS1
PS1. PS2는 줄 이어 쓸 때(>).
Q7. 현재 셸의 PID를 담은 특수 변수는?
- $PID
- $0
- $$
- $!
정답 보기
3번 $$
$$다. $!는 마지막으로 백그라운드에서 실행한 프로세스의 PID, $0은 셸이나 스크립트 이름이다.
헷갈리기 쉬운 O·X
NAME = kim처럼 등호 양옆에 공백을 넣어도 변수가 설정된다.
정답 보기
X 공백이 있으면 NAME이라는 명령으로 해석되어 오류.
export로 만든 환경 변수는 자식 프로세스에 전달된다.
정답 보기
O 맞는 설명이다.
unset은 변수의 값을 빈 문자열로 바꾸기만 하고 변수는 남긴다.
정답 보기
X unset은 변수 자체를 삭제한다.