공든탑앱 열기

셸 변수와 환경 변수

리눅스마스터 2급 · Shell · 약 10분

쉽게 말하면

셸 안에 값을 이름 붙여 저장해 둔 것이 변수예요(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호스트 이름
MAIL메일함 경로

특수 변수

$?직전 명령의 종료 상태 (0 성공, 그 외 실패)
$$현재 셸의 PID
$!마지막 백그라운드 작업의 PID
$0셸·스크립트 이름
$1 ~ $9위치 매개변수
$#매개변수 개수
$* · $@모든 매개변수

PATH에 디렉터리 추가

export PATH=$PATH:/opt/app/bin. 기존 값을 앞에 두고 콜론으로 이어 붙인다. 현재 디렉터리의 프로그램은 PATH에 없으므로 ./run.sh처럼 경로를 붙여 실행한다.

시험에 이렇게 나와요

확인 문제

Q1. 셸에서 NAME=kim을 설정한 뒤 bash로 새 셸(자식)을 열어 echo $NAME을 쳤다. 결과는?

  1. 오류
  2. kim
  3. 빈 줄 (아무것도 안 나옴)
  4. NAME
정답 보기

3번 빈 줄 (아무것도 안 나옴)

NAME=kim은 지역(셸) 변수라 현재 셸에만 있다. 자식 프로세스에게 물려주려면 export NAME으로 환경 변수로 만들어야 한다.

Q2. 명령을 백슬래시(\)로 다음 줄에 이어 쓸 때 나타나는 > 프롬프트를 정하는 변수는?

  1. TERM
  2. PS2
  3. PS1
  4. PROMPT_COMMAND
정답 보기

2번 PS2

PS2(보조 프롬프트)다. 기본값이 > 다. PS1은 평소의 주 프롬프트다.

Q3. 현재 시스템의 언어·문자 인코딩 설정을 담은 환경 변수는?

  1. MAIL
  2. HOME
  3. TERM
  4. LANG
정답 보기

4번 LANG

LANG(예: ko_KR.UTF-8).

Q4. 직전에 실행한 명령의 종료 상태 값을 담은 변수는?

  1. $!
  2. $?
  3. $#
  4. $$
정답 보기

2번 $?

$?다. 0이면 성공, 0이 아니면 실패다. $$는 현재 셸의 PID, $!는 마지막 백그라운드 PID, $#은 인자 개수다.

Q5. 환경 변수만 출력하는 명령이 아닌 것은?

  1. printenv
  2. set
  3. export (인자 없이)
  4. env
정답 보기

2번 set

set은 지역 변수까지 모두 출력.

Q6. 기본 프롬프트 모양을 정하는 변수는?

  1. PROMPT
  2. PS1
  3. TERM
  4. PS2
정답 보기

2번 PS1

PS1. PS2는 줄 이어 쓸 때(>).

Q7. 현재 셸의 PID를 담은 특수 변수는?

  1. $PID
  2. $0
  3. $$
  4. $!
정답 보기

3번 $$

$$다. $!는 마지막으로 백그라운드에서 실행한 프로세스의 PID, $0은 셸이나 스크립트 이름이다.

헷갈리기 쉬운 O·X

NAME = kim처럼 등호 양옆에 공백을 넣어도 변수가 설정된다.

정답 보기

X 공백이 있으면 NAME이라는 명령으로 해석되어 오류.

export로 만든 환경 변수는 자식 프로세스에 전달된다.

정답 보기

O 맞는 설명이다.

unset은 변수의 값을 빈 문자열로 바꾸기만 하고 변수는 남긴다.

정답 보기

X unset은 변수 자체를 삭제한다.

함께 보면 좋은 개념