- 변수는
이름=값으로 만든다. 등호 양옆에 공백이 있으면 안 된다. - 셸 변수는 지금 셸에서만, 환경 변수는 자식 프로세스까지 전달된다. 이 차이가 전부다.
- 셸 변수를 환경 변수로 승격시키는 명령이
export다. - 값을 꺼낼 때는
$이름을 쓴다.echo $PATH처럼. PATH는 명령을 찾는 경로 목록이고, 구분자는 콜론(:) 이다.
기준: 리눅스마스터 2급 출제 기준오류 제보
이름=값 으로 만든다. 등호 양옆에 공백이 있으면 안 된다.export 다.$이름 을 쓴다. echo $PATH 처럼.PATH는 명령을 찾는 경로 목록이고, 구분자는 콜론(:) 이다.NAME=linux # 만들기 — 등호 양옆에 공백 없이!
echo $NAME # linux
echo ${NAME} # 중괄호로 감싸도 된다
NAME="hello world" # 공백이 들어가면 따옴표로
unset NAME # 지우기공백이 실수의 원인이 되기 쉽다.
NAME = linux라고 쓰면 셸은NAME을 명령으로 보고 실행하려 한다.=양옆을 붙여 쓴다.
$를 붙인다. 만들 때는 붙이지 않는다.| 규칙 | 되는 예 | 안 되는 예 |
|---|---|---|
영문자·숫자·밑줄(_)만 쓴다 | MY_NAME, dir2 | MY-NAME, my.name |
| 숫자로 시작할 수 없다 | v1 | 1v |
| 대소문자를 구분한다 | Name과 NAME은 서로 다른 변수 | — |
FILE=report
echo $FILE_backup # (빈 줄) ← FILE_backup 이라는 변수를 찾는다
echo ${FILE}_backup # report_backupNAME=linux
echo "I use $NAME" # I use linux 큰따옴표 — 변수가 값으로 바뀐다
echo 'I use $NAME' # I use $NAME 작은따옴표 — 글자 그대로
echo "Today is `date +%F`" # Today is 2026-10-14 백틱 — 명령을 실행한 결과
echo "Today is $(date +%F)" # 위와 같다| 기호 | 이름 | 안에 든 $변수는 |
|---|---|---|
" " | 큰따옴표 | 값으로 바뀐다 |
' ' | 작은따옴표 | 바뀌지 않는다 (문자 그대로) |
` ` | 백틱(역따옴표) | 안의 명령을 실행한 결과로 바뀐다. $( ) 와 같다 |
\ | 역슬래시 | 바로 뒤 한 글자의 특수한 뜻을 없앤다 — echo \$NAME 은 $NAME |
큰따옴표는 풀고 작은따옴표는 막는다. 둘 다 공백을 하나의 값으로 묶어 주는 것은 같지만,
$를 해석하느냐가 다르다. 백틱은 따옴표처럼 생겼어도 명령 실행이라는 전혀 다른 일을 한다.
현재 셸
├── NAME=linux (셸 변수) ─┐
└── export AGE=30 (환경 변수) ─┼─ 자식에게 전달되는 건?
│ │
▼ 자식 프로세스 실행 │
자식 셸 │
NAME → 비어 있음 ◄────────────┘ 전달 안 됨
AGE → 30 전달 됨| 구분 | 셸 변수 | 환경 변수 |
|---|---|---|
| 범위 | 현재 셸에서만 | 자식 프로세스까지 |
| 만들기 | NAME=값 | export NAME=값 |
| 보기 | set | env 또는 printenv |
| 예 | 사용자가 임시로 만든 변수 | PATH, HOME, SHELL |
NAME=linux # 셸 변수
export NAME # 환경 변수로 승격
export AGE=30 # 만들면서 바로 환경 변수로| 명령 | 보여 주는 것 |
|---|---|
set | 셸 변수 + 환경 변수 전부 |
env | 환경 변수만 |
printenv | 환경 변수만 (env와 비슷) |
export | 환경 변수 목록 |
unset 이름 | 변수 삭제 |
set은 전부,env는 환경 변수만. 이 짝이 시험 범위에 든다. 출력 범위로 기억하면set이 더 넓다.
NAME=linux # 셸 변수
export AGE=30 # 환경 변수
bash # 자식 셸로 들어간다
echo "[$NAME] [$AGE]"
# [] [30] ← NAME 은 비어 있고 AGE 만 넘어왔다
AGE=99 # 자식에서 값을 바꿔 본다
exit # 부모 셸로 돌아온다
echo $AGE
# 30 ← 부모의 값은 그대로다bash script.sh 로 실행한 스크립트도 자식 셸이다. 스크립트 안에서 export 한 변수는 스크립트가 끝나면 사라진다.export 한 변수는 값을 다시 바꿔도 계속 환경 변수다. 바꿀 때마다 export를 다시 할 필요가 없다.export -p | head -3
# declare -x HOME="/home/user"
# declare -x LANG="ko_KR.UTF-8"
# declare -x LOGNAME="user"
printenv HOME # /home/user ← 이름을 주면 그 값만 나온다
env | grep LANG # LANG=ko_KR.UTF-8
export -n AGE # 환경 변수를 다시 셸 변수로 (값은 남는다)
unset AGE # 변수 자체를 삭제
env LANG=C date # 이 명령 한 번에만 LANG 을 바꿔 실행한다
# Wed Oct 14 09:30:00 KST 2026| 헷갈리는 짝 | 차이 |
|---|---|
unset vs export -n | 변수를 삭제 / 값은 두고 환경 변수 자격만 뺀다 |
env vs printenv | 둘 다 환경 변수를 출력한다. printenv는 이름을 지정할 수 있고, env는 임시 환경으로 명령을 실행할 수 있다 |
set vs env | set의 출력에는 셸 변수뿐 아니라 셸 함수까지 들어 있다 |
export -p 출력의 declare -x 에서 x가 export 속성이다. 그래서 declare -x NAME은 export NAME과 같지만, 옵션 없는 declare NAME은 환경 변수를 만들지 않는다.unset NAME 이다. unset $NAME 이라고 쓰면 NAME에 들어 있는 값을 이름으로 가진 변수를 지우려 한다.| 변수 | 담는 것 |
|---|---|
PATH | 명령을 찾을 디렉터리 목록 |
HOME | 홈 디렉터리 |
SHELL | 로그인 셸 |
USER | 현재 사용자 이름 |
PWD | 현재 작업 디렉터리 |
LANG | 언어와 문자 인코딩 |
TERM | 터미널 종류 |
PS1 | 프롬프트 모양 |
HISTSIZE | 히스토리에 담을 명령 개수 |
EDITOR | 기본 편집기 |
HOSTNAME | 호스트 이름 |
LOGNAME | 로그인 이름 |
echo $HOME # /home/user
echo $USER # user
echo $PWD # 현재 디렉터리 — pwd 명령과 같은 값
echo $LANG # ko_KR.UTF-8| 변수 | 담는 것 |
|---|---|
PS2 | 명령이 끝나지 않았을 때 나오는 2차 프롬프트 (기본값 >) |
HISTFILE | 히스토리가 저장되는 파일 (기본값 ~/.bash_history) |
HISTFILESIZE | 히스토리 파일에 남길 줄 수 |
TMOUT | 입력 없이 이 초가 지나면 자동으로 로그아웃 |
MAIL | 메일함 경로 |
DISPLAY | X 윈도 화면이 표시될 곳 |
OLDPWD | 직전 작업 디렉터리 — cd - 가 돌아가는 곳 |
HISTSIZE는 메모리에 기억할 개수, HISTFILESIZE는 파일에 남길 개수다. 이름이 비슷해 바꿔 묻는다.USER와 LOGNAME은 보통 같은 값이다.echo $PS1
# [\u@\h \W]\$
# 화면에는 이렇게 보인다 → [user@server1 ~]$| 기호 | 바뀌는 값 |
|---|---|
\u | 사용자 이름 (user) |
\h | 호스트 이름 (host) |
\w | 현재 디렉터리의 전체 경로 |
\W | 현재 디렉터리의 마지막 이름만 |
\$ | root면 #, 일반 사용자면 $ |
\d / \t | 날짜 / 시각(24시간) |
\! | 히스토리 번호 |
\w와 \W는 대소문자로 갈린다. /usr/local/bin 에 있을 때 \w는 /usr/local/bin, \W는 bin 을 보여 준다.#이면 root로 작업 중이라는 뜻이다. \$ 가 이 구분을 만든다.echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
# └ 콜론(:) 으로 구분한다ls라고 치면 셸은 PATH에 적힌 디렉터리를 앞에서부터 차례로 뒤져 실행 파일을 찾는다.:) 이다. 윈도가 세미콜론을 쓰는 것과 다르다.export PATH=$PATH:/opt/myapp/bin # 뒤에 추가 (권장)
export PATH=/opt/myapp/bin:$PATH # 앞에 추가 (우선하게)
which ls # /usr/bin/ls — 실제로 찾은 위치⚠️
export PATH=/opt/bin처럼$PATH를 빼먹으면 기존 경로가 전부 날아가ls조차 실행되지 않는다. 반드시$PATH:를 포함해서 쓴다.
.)는 PATH에 넣지 않는 것이 원칙이다. 악성 파일을 같은 이름으로 심어 두면 그것이 실행되기 때문이다. 그래서 현재 위치의 스크립트는 ./script.sh 처럼 경로를 붙여 실행한다.ls -l backup.sh
# -rwxr-xr-x 1 user user 120 Oct 14 09:00 backup.sh
backup.sh
# bash: backup.sh: command not found
./backup.sh
# backup start...| 메시지 | 원인 |
|---|---|
command not found | PATH 어디에도 그 이름이 없다 |
Permission denied | 찾기는 했는데 실행 권한(x)이 없다 |
which는 PATH에서 찾은 실행 파일의 위치를, type은 그 이름이 별칭인지 내부 명령인지까지 알려 준다.cd·echo·export 같은 내부 명령은 PATH와 상관없이 실행된다. 그래서 PATH를 망가뜨렸어도 export PATH=/usr/bin:/bin 을 쳐서 되살릴 수 있다.| 변수 | 뜻 |
|---|---|
$? | 직전 명령의 종료 상태 (0이면 성공) |
$$ | 현재 셸의 PID |
$0 | 실행 중인 셸이나 스크립트 이름 |
$! | 마지막 백그라운드 작업의 PID |
ls /없는경로
echo $? # 2 ← 0이 아니면 실패
ls /etc
echo $? # 0 ← 성공$?가 0이면 성공이다. 0이 아닌 값은 오류를 뜻한다. 일반적인 참/거짓과 반대라 헷갈리기 쉽다.$? 값 | 뜻 |
|---|---|
| 0 | 성공 |
| 1 | 일반적인 실패 — 예: grep이 맞는 줄을 하나도 못 찾음 |
| 2 | 사용법 오류 등 — 예: ls가 지정한 파일에 접근하지 못함 |
| 126 | 찾았지만 실행할 수 없음 (권한 없음) |
| 127 | 명령을 찾지 못함 (command not found) |
| 130 | Ctrl+C 로 중단됨 |
grep root /etc/passwd > /dev/null
echo $? # 0
echo $? # 0 ← 방금 실행한 echo 의 결과다. grep 의 값은 이미 덮였다
echo $$ # 2314 ← 지금 셸의 PID
sleep 100 &
echo $! # 2377 ← 방금 백그라운드로 보낸 sleep 의 PID$?는 직전 명령 하나만 기억한다. 확인하려면 다른 명령을 끼우지 말고 바로 꺼내야 한다.export PATH=$PATH:/opt/bin # 지금 이 셸에서만 유효| 만드는 방법 | 살아 있는 범위 |
|---|---|
NAME=값 명령 또는 env NAME=값 명령 | 그 명령 한 번에만 |
NAME=값 | 현재 셸 |
export NAME=값 | 현재 셸과 거기서 띄운 자식들 |
설정 파일(~/.bashrc 등)에 적기 | 로그인할 때마다 다시 만들어진다 |
~/.bashrc나 ~/.bash_profile. 이것이 내일 주제다.내일은 이 변수들이 언제 어떤 순서로 읽히는지 — 셸 환경 설정 파일을 다룬다.
export로 만든다.export : 셸 변수를 환경 변수로 승격시키는 명령.set : 셸 변수와 환경 변수를 모두 보여 주는 명령.env : 환경 변수만 보여 주는 명령.PATH : 실행 파일을 찾을 디렉터리 목록. 콜론으로 구분한다.PS1 : 프롬프트의 모양을 정하는 환경 변수.$? : 직전 명령의 종료 상태를 담은 특수 변수. 0이면 성공이다.선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
다음 중 셸 변수를 환경 변수로 만들어 자식 프로세스에도 전달되게 하는 명령으로 알맞은 것은?
문제 2
다음 중 실행 파일을 찾을 디렉터리 목록을 담고 있는 환경 변수로 알맞은 것은?
문제 3
다음 중 PATH 환경 변수에서 각 디렉터리를 구분하는 문자로 알맞은 것은?
문제 4
다음 중 환경 변수만 출력하는 명령으로 알맞은 것은?
문제 5
다음 중 변수를 올바르게 선언한 것으로 알맞은 것은?