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 1

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

리눅스마스터 2급· AssociateWeek 5 · Day 1읽기 약 8분
핵심 정리
  • 셸은 사용자의 명령을 해석해 커널에 전달하는 프로그램이다. 껍데기(shell)라는 이름이 여기서 나왔다.
  • 셸은 크게 Bourne 계열(sh·ksh·bash·zsh) 과 C 계열(csh·tcsh) 두 갈래로 나뉜다.
  • 리눅스의 기본 셸은 bash 다. Bourne Again SHell 의 줄임말이다.
  • 지금 쓰는 셸은 echo $SHELL, 쓸 수 있는 셸 목록은 /etc/shells, 바꾸는 명령은 chsh 다.
  • 사용자의 로그인 셸은 /etc/passwd의 7번째(마지막) 필드에 적혀 있다.

Day 1 - 셸이란 무엇인가

셸의 자리

사용자와 하드웨어 사이에서 셸과 커널이 놓인 자리

  • 셸은 커널을 감싸는 껍데기다. 사용자는 커널을 직접 건드리지 않고 셸을 통해 요청한다.
  • 셸이 하는 일은 크게 넷이다 — 명령 해석 · 프로그램 실행 · 환경 설정 · 스크립트 실행.
  • 셸은 커널의 일부가 아니라 하나의 응용 프로그램이다. 그래서 갈아 끼울 수 있다.

명령 한 줄이 실행되기까지

ls -l /etc 를 치고 엔터를 누르면 셸 안에서는 다음이 차례로 일어난다.

   1. 읽기      입력한 한 줄을 받는다
   2. 쪼개기    공백을 기준으로 명령(ls) · 옵션(-l) · 인자(/etc) 로 나눈다
   3. 바꾸기    $변수, 와일드카드(*), 별칭을 실제 값으로 바꾼다
   4. 찾기      내부 명령인지 확인하고, 아니면 PATH 에서 실행 파일을 찾는다
   5. 실행      자식 프로세스를 만들어 그 프로그램을 실행시킨다
   6. 기다리기  끝나면 종료 상태를 받고 다시 프롬프트를 띄운다
  • 3번 때문에 ls *.txt 에서 *를 파일 이름들로 바꾸는 것은 ls가 아니라 셸이다. ls는 이미 풀린 파일 이름 목록을 받는다.
  • 4번에서 갈리는 것이 내부 명령과 외부 명령이다.
구분무엇예확인
내부 명령(builtin)셸 자체에 들어 있는 명령. 새 프로세스를 만들지 않는다cd, echo, export, alias, history, exittype cd
외부 명령디스크에 별도 실행 파일로 있는 명령ls, cp, cat, viwhich cat
type cd
# cd is a shell builtin
type cat
# cat is /usr/bin/cat
type ls
# ls is aliased to `ls --color=auto'

cd가 내부 명령인 데는 이유가 있다. 디렉터리 이동은 셸 자신의 현재 위치를 바꾸는 일이라 자식 프로세스가 대신해 줄 수 없다. 자식이 이동해 봐야 부모인 셸은 제자리다.

셸의 갈래

                   Thompson shell (1971)
                          │
        ┌─────────────────┴─────────────────┐
        │                                   │
   Bourne shell (sh, 1977)            C shell (csh, 1978)
   Stephen Bourne                     Bill Joy
        │                                   │
   ┌────┴────┬──────────┐                  │
   │         │          │                  │
  ksh      bash       dash               tcsh
 (Korn)  (GNU, 1989)                    (개선판)
   │         │
   └────► zsh (ksh·bash·tcsh 기능 흡수)
셸이름의 뜻만든 사람계열특징
shBourne shellStephen BourneBourne최초의 표준 셸. 기능은 적지만 어디에나 있다
cshC shellBill JoyCC 언어와 비슷한 문법. 히스토리·별칭 도입
tcshTENEX C shell—Ccsh 개선판. 명령 완성 기능
kshKorn shellDavid KornBournesh 호환 + csh 기능 결합
bashBourne Again shellBrian FoxBourne리눅스 기본 셸. GNU 프로젝트
zshZ shellPaul FalstadBourne강력한 자동완성. macOS 기본 셸
dashDebian Almquist shell—Bourne가볍고 빠르다. 스크립트 전용으로 쓰인다

계열을 가르는 문제가 나온다. csh와 tcsh만 C 계열이고 나머지는 전부 Bourne 계열이다. 이름에 c가 들어간 둘만 따로 묶는다고 기억하면 편하다.

셸마다 무엇이 달랐나

셸의 역사는 "앞선 셸에 없던 편의 기능을 누가 넣었는가" 로 읽으면 외우기 쉽다. 등장 순서는 sh(1977) → csh(1978) → ksh(1983) → bash(1989) → zsh(1990) 이다.

기능shcshtcshkshbash
히스토리(명령 이력)✕○○○○
별칭(alias)✕○○○○
작업 제어(fg·bg)✕○○○○
명령행 편집✕✕○○○
sh 스크립트와 호환—✕✕○○
  • 히스토리·별칭·작업 제어를 처음 넣은 셸이 csh다. "이 기능을 처음 도입한 셸"을 물으면 bash가 아니라 csh다.
  • csh의 약점은 sh와 문법이 달라 스크립트가 호환되지 않는다는 점이다. C 계열과 Bourne 계열을 가르는 실질적인 기준이 이 문법 차이다.
  • ksh는 sh 문법을 지키면서 csh의 편의 기능을 가져왔고, bash는 거기에 ksh의 장점까지 더했다. bash가 표준이 된 이유다.
  • 기본 프롬프트도 계열을 따른다. Bourne 계열은 $, C 계열은 %, 어느 쪽이든 root는 # 이다.
ls -l /bin/sh
# lrwxrwxrwx. 1 root root 4 ... /bin/sh -> bash     ← 레드햇 계열
# lrwxrwxrwx  1 root root 4 ... /bin/sh -> dash     ← 데비안·우분투

요즘 리눅스에 진짜 Bourne shell은 없다. /bin/sh는 다른 셸로 가는 심볼릭 링크다. 레드햇 계열은 bash를, 데비안 계열은 가벼운 dash를 가리킨다. 표에서 dash가 "스크립트 전용"으로 적힌 이유가 이것이다.

만든 사람과 이름

2급에서는 누가 만들었는가를 그대로 묻는다.

셸만든 사람
shStephen Bourne
cshBill Joy
kshDavid Korn
bashBrian Fox
  • ksh는 Korn의 이름에서, csh는 C 언어에서, bash는 Bourne Again(다시 태어난 Bourne)에서 왔다.
  • bash의 이름은 "born again"(거듭난)과 발음이 같은 말장난이다.

지금 무슨 셸을 쓰고 있나

echo $SHELL          # /bin/bash   ← 로그인 셸
echo $0              # -bash       ← 지금 실행 중인 셸
cat /etc/shells      # 이 시스템에서 쓸 수 있는 셸 목록
which bash           # /usr/bin/bash
방법알려 주는 것
echo $SHELL로그인 셸 (기본으로 지정된 셸)
echo $0지금 실행 중인 셸
/etc/shells사용 가능한 셸 목록 파일
/etc/passwd 7번째 필드그 사용자의 로그인 셸

$SHELL과 $0이 다를 수 있다. 로그인은 bash로 했지만 그 안에서 zsh를 실행했다면 $SHELL은 여전히 /bin/bash, $0은 zsh가 된다.

직접 확인해 보기

cat /etc/shells
# /bin/sh
# /bin/bash
# /usr/bin/sh
# /usr/bin/bash
# /bin/tcsh
# /bin/zsh
 
grep "^user:" /etc/passwd
# user:x:1000:1000:Test User:/home/user:/bin/bash
 
ps -p $$
#     PID TTY          TIME CMD
#    2314 pts/0    00:00:00 bash
  • /etc/shells에는 셸이 절대 경로로 한 줄에 하나씩 적혀 있다. 설치된 셸에 따라 목록이 달라진다.
  • $$는 현재 셸의 PID다. 그래서 ps -p $$ 가 "지금 실행 중인 셸"을 확인하는 가장 확실한 방법이다.
  • echo $0 결과가 -bash처럼 하이픈으로 시작하면 로그인 셸이라는 표시다. 그 안에서 다시 띄운 셸은 하이픈 없이 bash로 나온다.
  • $SHELL은 로그인할 때 /etc/passwd 값으로 채워지는 변수일 뿐이다. 다른 셸을 실행한다고 저절로 바뀌지 않는다.

셸 바꾸기

chsh -s /bin/zsh          # 내 로그인 셸을 zsh 로
chsh -s /bin/zsh alice    # alice 의 로그인 셸을 (root 권한)
chsh -l                   # 사용 가능한 셸 목록
  • chsh(change shell) 는 /etc/passwd의 마지막 필드를 고친다. 다음 로그인부터 적용된다.
  • /etc/shells에 등록된 셸로만 바꿀 수 있다.
  • 로그인시키지 않을 계정에는 /sbin/nologin 이나 /bin/false를 셸로 준다. 계정은 있지만 로그인은 막는 방법이다.
   user:x:1000:1000:Test User:/home/user:/bin/bash
                                            └─┬─┘
                                              └── 7번째 필드 = 로그인 셸

바꾸는 세 가지 길

방법누가 쓸 수 있나비고
chsh -s 셸 [사용자]본인(자기 것), root(누구 것이든)일반 사용자는 암호 확인을 거친다
usermod -s 셸 사용자root계정 속성을 고치는 명령의 -s 옵션
/etc/passwd 직접 편집root7번째 필드를 고친다. 오타 하나로 로그인이 막힐 수 있다
chsh -s /bin/zsh
# Changing shell for user.
# Password:
# Shell changed.
echo $SHELL
# /bin/bash        ← 아직 그대로다. 다시 로그인해야 바뀐다
grep "^user:" /etc/passwd
# user:x:1000:1000:Test User:/home/user:/bin/zsh
  • 파일은 바로 바뀌지만 지금 셸은 그대로다. chsh는 실행 중인 셸을 건드리지 않고 다음 로그인 때 쓸 값만 고친다.
  • 잠깐 써 보는 것이라면 그냥 zsh 라고 실행하면 된다. exit 하면 원래 셸로 돌아오고 /etc/passwd는 바뀌지 않는다.
  • chsh -l 은 레드햇 계열에서 지원한다. 데비안 계열의 chsh에는 이 옵션이 없으므로 cat /etc/shells 로 본다.
  • 계정을 만들 때부터 셸을 정하려면 useradd -s /bin/zsh alice 처럼 쓴다.

로그인을 막는 셸

셸접속을 시도하면
/sbin/nologin"This account is currently not available." 라는 안내를 보여 주고 끊는다
/bin/false아무 말 없이 곧바로 끊는다
grep nologin /etc/passwd | head -3
# bin:x:1:1:bin:/bin:/sbin/nologin
# daemon:x:2:2:daemon:/sbin:/sbin/nologin
# apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
  • 이런 계정은 사람이 아니라 서비스가 쓰는 시스템 계정이다. 프로그램의 소유자로만 쓰이므로 로그인할 이유가 없다.
  • 계정을 지우는 것(userdel)과 다르다. 계정과 파일 소유권은 그대로 두고 접속만 막는다.
  • 데비안 계열에서는 경로가 /usr/sbin/nologin 이다.

로그인 셸과 비로그인 셸

구분언제읽는 설정 파일
로그인 셸로그인할 때, su -/etc/profile, ~/.bash_profile
비로그인 셸터미널 창을 새로 열 때~/.bashrc
  • 이 구분에 따라 읽는 설정 파일이 달라진다. 자세한 순서는 3일 뒤에 다룬다.
  • su와 su -의 차이가 여기서도 나온다. 하이픈을 붙이면 로그인 셸로 시작한다.

내일은 셸이 기억하는 값 — 셸 변수와 환경 변수를 다룬다.

📖 용어

  • 셸(shell) : 사용자의 명령을 해석해 커널에 전달하는 프로그램. 커널을 감싸는 껍데기.
  • Bourne 계열 : sh에서 갈라져 나온 셸들. ksh, bash, zsh, dash가 여기 속한다.
  • C 계열 : csh에서 갈라져 나온 셸들. csh와 tcsh 둘뿐이다.
  • bash : Bourne Again SHell. Brian Fox가 만든 GNU 셸이며 리눅스의 기본 셸이다.
  • 로그인 셸 : 로그인할 때 실행되는 셸. /etc/passwd의 7번째 필드에 지정된다.
  • /etc/shells : 시스템에서 사용할 수 있는 셸의 경로 목록을 담은 파일.
  • chsh : 로그인 셸을 변경하는 명령. 다음 로그인부터 적용된다.
  • /sbin/nologin : 로그인을 막기 위해 지정하는 셸. 계정은 있지만 접속은 되지 않는다.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

다음 중 리눅스에서 기본 셸로 사용되며 Bourne Again SHell의 줄임말인 것으로 알맞은 것은?

문제 2

다음 중 C 셸 계열에 속하는 셸로 알맞은 것은?

문제 3

다음 중 Korn shell을 개발한 사람으로 알맞은 것은?

문제 4

다음 중 시스템에서 사용할 수 있는 셸의 목록을 담고 있는 파일로 알맞은 것은?

문제 5

다음 중 사용자의 로그인 셸을 변경하는 명령으로 알맞은 것은?

이전Week 4 종합 복습: 권한 한 장 정리Week 4 · Day 5다음 셸 변수와 환경 변수Week 5 · Day 2

참고 공식 자료

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

이 페이지

  • 셸의 자리
  • 명령 한 줄이 실행되기까지
  • 셸의 갈래
  • 셸마다 무엇이 달랐나
  • 만든 사람과 이름
  • 지금 무슨 셸을 쓰고 있나
  • 직접 확인해 보기
  • 셸 바꾸기
  • 바꾸는 세 가지 길
  • 로그인을 막는 셸
  • 로그인 셸과 비로그인 셸
  • 용어
  • 연습 문제