CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
  • Week 1
    • 1.운영체제와 커널: 리눅스가 하는 일
    • 2.리눅스의 탄생: 유닉스에서 리누스까지
    • 3.자유 소프트웨어와 오픈소스: 라이선스가 정하는 것
    • 4.배포판: 커널과 도구를 하나로 묶어 파는 단위
    • 5.Week 1 종합 복습: 리눅스라는 이름의 정체
  • Week 2
  • Week 3
  • Week 4
  • Week 5
    • 1.셸이란 무엇인가
    • 2.셸 변수와 환경 변수
    • 3.환경 설정 파일
    • 4.리다이렉션 · 별칭 · 히스토리
    • 5.Week 5 종합 복습: 셸 한 장 정리
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
리눅스마스터 1급 · 1급리눅스마스터 1급
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 2급/Week 5/Day 2

기준: 리눅스마스터 2급 출제 기준·오류 제보

리눅스마스터 2급· AssociateWeek 5 · Day 2읽기 약 3분
핵심 정리
  • 변수는 이름=값 으로 만든다. 등호 양옆에 공백이 있으면 안 된다.
  • 셸 변수는 지금 셸에서만, 환경 변수는 자식 프로세스까지 전달된다. 이 차이가 전부다.
  • 셸 변수를 환경 변수로 승격시키는 명령이 export 다.
  • 값을 꺼낼 때는 $이름 을 쓴다. echo $PATH 처럼.
  • PATH는 명령을 찾는 경로 목록이고, 구분자는 콜론(:) 이다.

Day 2 - 셸 변수와 환경 변수

변수 만들기

NAME=linux           # 만들기 — 등호 양옆에 공백 없이!
echo $NAME           # linux
echo ${NAME}         # 중괄호로 감싸도 된다
NAME="hello world"   # 공백이 들어가면 따옴표로
unset NAME           # 지우기

공백이 실수의 원인이 되기 쉽다. NAME = linux 라고 쓰면 셸은 NAME 을 명령으로 보고 실행하려 한다. = 양옆을 붙여 쓴다.

  • 변수 이름은 관례상 대문자를 쓴다. 필수는 아니지만 시스템 변수와 구분하기 좋다.
  • 값을 꺼낼 때만 $를 붙인다. 만들 때는 붙이지 않는다.

이름 짓는 규칙과 중괄호

규칙되는 예안 되는 예
영문자·숫자·밑줄(_)만 쓴다MY_NAME, dir2MY-NAME, my.name
숫자로 시작할 수 없다v11v
대소문자를 구분한다Name과 NAME은 서로 다른 변수—
FILE=report
echo $FILE_backup      # (빈 줄)        ← FILE_backup 이라는 변수를 찾는다
echo ${FILE}_backup    # report_backup
  • 중괄호는 변수 이름이 어디서 끝나는지 알려 주는 표시다. 뒤에 글자가 바로 붙을 때 필요하다.
  • 없는 변수를 꺼내면 오류가 아니라 빈 값이 나온다. 이름을 잘못 쳐도 조용히 넘어가므로 오타를 알아채기 어렵다.

따옴표에 따라 달라지는 값

NAME=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

큰따옴표는 풀고 작은따옴표는 막는다. 둘 다 공백을 하나의 값으로 묶어 주는 것은 같지만, $를 해석하느냐가 다르다. 백틱은 따옴표처럼 생겼어도 명령 실행이라는 전혀 다른 일을 한다.

셸 변수 vs 환경 변수

   현재 셸
   ├── NAME=linux        (셸 변수)   ─┐
   └── export AGE=30     (환경 변수) ─┼─ 자식에게 전달되는 건?
        │                             │
        ▼ 자식 프로세스 실행           │
      자식 셸                          │
        NAME → 비어 있음  ◄────────────┘  전달 안 됨
        AGE  → 30                         전달 됨
구분셸 변수환경 변수
범위현재 셸에서만자식 프로세스까지
만들기NAME=값export NAME=값
보기setenv 또는 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 envset의 출력에는 셸 변수뿐 아니라 셸 함수까지 들어 있다
  • 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메일함 경로
DISPLAYX 윈도 화면이 표시될 곳
OLDPWD직전 작업 디렉터리 — cd - 가 돌아가는 곳
  • HISTSIZE는 메모리에 기억할 개수, HISTFILESIZE는 파일에 남길 개수다. 이름이 비슷해 바꿔 묻는다.
  • USER와 LOGNAME은 보통 같은 값이다.

PS1 — 프롬프트 모양

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로 작업 중이라는 뜻이다. \$ 가 이 구분을 만든다.

PATH — 명령을 어디서 찾나

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 처럼 경로를 붙여 실행한다.

PATH에 없으면 벌어지는 일

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...
  • 파일이 눈앞에 있고 실행 권한도 있는데 못 찾는다. 셸은 현재 디렉터리가 아니라 PATH에 적힌 곳만 뒤지기 때문이다.
메시지원인
command not foundPATH 어디에도 그 이름이 없다
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)
130Ctrl+C 로 중단됨
grep root /etc/passwd > /dev/null
echo $?        # 0
echo $?        # 0     ← 방금 실행한 echo 의 결과다. grep 의 값은 이미 덮였다
echo $$        # 2314  ← 지금 셸의 PID
sleep 100 &
echo $!        # 2377  ← 방금 백그라운드로 보낸 sleep 의 PID
  • 외울 것은 하나다 — 0만 성공이고 나머지는 전부 실패다. 값의 범위는 0~255이며 0이 아닌 값의 세부 뜻은 명령마다 다르다.
  • $?는 직전 명령 하나만 기억한다. 확인하려면 다른 명령을 끼우지 말고 바로 꺼내야 한다.

변수는 셸을 벗어나면 사라진다

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

다음 중 변수를 올바르게 선언한 것으로 알맞은 것은?

이전셸이란 무엇인가Week 5 · Day 1다음 환경 설정 파일Week 5 · Day 3

참고 공식 자료

  • 리눅스마스터 2급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • 변수 만들기
  • 이름 짓는 규칙과 중괄호
  • 따옴표에 따라 달라지는 값
  • 셸 변수 vs 환경 변수
  • 직접 확인: 자식 셸에서 보이는가
  • 변수를 다루는 명령 더 보기
  • 주요 환경 변수
  • 함께 묻는 변수들
  • PS1 — 프롬프트 모양
  • PATH — 명령을 어디서 찾나
  • PATH에 없으면 벌어지는 일
  • 특수 변수
  • 변수는 셸을 벗어나면 사라진다
  • 용어
  • 연습 문제