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 4

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

리눅스마스터 2급· AssociateWeek 5 · Day 4읽기 약 8분
핵심 정리
  • 모든 명령에는 표준 입력(0) · 표준 출력(1) · 표준 에러(2) 세 통로가 있다.
  • >는 덮어쓰기, >>는 이어 붙이기다. 이 둘을 바꿔 쓰면 파일이 날아간다.
  • 에러는 2>로 따로 돌린다. >만으로는 에러 메시지가 파일에 담기지 않는다.
  • 별칭은 alias, 지우기는 unalias 다. 유지하려면 ~/.bashrc에 적는다.
  • 히스토리는 history 로 보고, !!(직전) · !번호 로 다시 실행한다.

Day 4 - 리다이렉션 · 별칭 · 히스토리

세 개의 통로

                  ┌─────────────┐
   표준 입력 (0) ─►│    명령     │─► 표준 출력 (1)   결과
      키보드       │             │─► 표준 에러 (2)   오류 메시지
                  └─────────────┘        화면
이름번호기본 연결
표준 입력 (stdin)0키보드
표준 출력 (stdout)1화면
표준 에러 (stderr)2화면
  • 0·1·2 라는 번호를 그대로 묻는 문제가 나온다. 입력이 0, 출력이 1, 에러가 2다.
  • 출력과 에러는 둘 다 화면으로 나오지만 서로 다른 통로다. 그래서 따로 돌릴 수 있다.

출력 방향 돌리기

ls > list.txt         # 결과를 파일로 (덮어쓰기)
ls >> list.txt        # 결과를 파일 끝에 (이어 붙이기)
기호하는 일
>표준 출력을 파일로 — 기존 내용을 지우고
>>표준 출력을 파일로 — 끝에 이어서
2>표준 에러를 파일로 (덮어쓰기)
2>>표준 에러를 파일로 (이어 붙이기)
&>출력과 에러를 한꺼번에
<파일을 표준 입력으로

⚠️ >는 파일을 먼저 비운다. cat a.txt > a.txt 같은 명령은 파일을 통째로 날린다. 기록을 남기는 로그에는 >> 를 쓴다.

에러만 따로

find / -name "*.conf" > result.txt          # 결과만 파일로, 에러는 화면에
find / -name "*.conf" 2> error.txt          # 에러만 파일로
find / -name "*.conf" > out.txt 2> err.txt  # 따로따로
find / -name "*.conf" &> all.txt            # 둘 다 한 파일로
find / -name "*.conf" 2> /dev/null          # 에러를 버리기
  • /dev/null은 버리는 곳이다. 여기로 보낸 내용은 사라진다. 권한 오류 메시지가 잔뜩 나올 때 유용하다.
  • > out.txt 2>&1 도 둘을 합치는 표기다. 2>&1은 "에러를 출력이 가는 곳과 같은 데로" 라는 뜻이다.

2>&1은 적는 순서가 중요하다

ls /etc /nodir > out.txt 2>&1     # 출력과 에러가 모두 out.txt 로 간다
ls /etc /nodir 2>&1 > out.txt     # 출력만 out.txt 로, 에러는 여전히 화면에
# ls: cannot access '/nodir': No such file or directory
  • 셸은 리다이렉션을 왼쪽부터 차례로 처리한다. 2>&1은 "지금 1번이 향하는 곳으로 2번도 보내라"는 뜻이다.
  • 두 번째 줄에서는 2>&1 시점에 1번이 아직 화면을 향하고 있다. 그 뒤에 1번만 파일로 바뀌므로 에러는 화면에 남는다.
  • &를 빼고 2>1 이라고 쓰면 에러가 1 이라는 이름의 파일에 저장된다.
표기표준 출력이 가는 곳표준 에러가 가는 곳
명령 > aa화면
명령 2> a화면a
명령 > a 2> bab
명령 > a 2>&1aa
명령 &> aaa
명령 2>&1 > aa화면
명령 > /dev/null 2>&1버림버림
  • >는 1>을 줄여 쓴 것이다. 번호를 생략하면 1번(표준 출력) 이다.

덮어쓰기 사고를 막는 noclobber

set -o noclobber      # 켜기
ls > list.txt
# bash: list.txt: cannot overwrite existing file
ls >| list.txt        # 이번 한 번만 강제로 덮어쓴다
set +o noclobber      # 끄기
  • 이 옵션을 켜면 >로 이미 있는 파일을 덮어쓰지 못한다. >>(이어 붙이기)는 영향을 받지 않는다.
  • -o가 켜기, +o가 끄기다. 부호가 직관과 반대다.
  • 명령 없이 > 파일 만 쓰면 빈 파일이 만들어진다. 이미 있는 파일이면 내용이 비워진다.

입력 방향 돌리기

wc -l < list.txt        # 파일을 입력으로
sort < names.txt
  • <는 키보드 대신 파일에서 입력을 받는다.
wc -l list.txt       # 12 list.txt   ← 파일 이름이 함께 나온다
wc -l < list.txt     # 12            ← 이름이 없다. 내용만 넘겨받았기 때문이다
기호입력을 받는 곳
<파일
<<끝 표시가 나올 때까지 직접 입력한 내용 (Here Document)
cat << EOF > hello.txt
first line
second line
EOF
  • << 뒤에 적은 단어(EOF)가 다시 나올 때까지를 입력으로 삼는다. 단어는 아무것이나 정해도 된다.
  • cat > memo.txt 처럼 입력 없이 출력만 돌리면 키보드로 친 내용이 파일에 저장된다. 다 쳤으면 Ctrl+D 로 끝낸다.

파이프로 잇기

ps -ef | grep httpd | wc -l      # 여러 개를 이어도 된다
cat /etc/passwd | sort | head -5
ls -l | grep "^d"                # 디렉터리만
  • |(파이프) 는 앞 명령의 표준 출력을 뒤 명령의 표준 입력으로 넘긴다.
  • 파일이 아니라 명령으로 넘긴다는 점이 리다이렉션과 다르다.
구분리다이렉션 >파이프
넘기는 대상파일다음 명령
예ls > a.txtls | grep txt
find / -name "*.conf" | wc -l                 # 에러 메시지는 파이프를 타지 않고 화면에 그대로 나온다
find / -name "*.conf" 2> /dev/null | wc -l    # 에러는 버리고 개수만 센다
find / -name "*.conf" 2>&1 | grep denied      # 에러까지 파이프로 넘긴다
  • 파이프가 넘기는 것은 표준 출력(1번)뿐이다. 에러까지 넘기려면 2>&1 로 먼저 합친다.
  • 파이프의 양쪽은 모두 명령이어야 한다. ls | list.txt 라고 쓰면 list.txt 를 명령으로 실행하려다 실패한다.

명령을 잇는 다른 기호

기호뒤 명령이 실행되는 조건예
;앞의 성공 여부와 관계없이 차례로cd /tmp ; ls
&&앞이 성공했을 때만mkdir work && cd work
||앞이 실패했을 때만cd work || echo "no dir"
|항상 — 앞의 출력을 입력으로 받는다ls | wc -l
&앞 명령을 백그라운드로 보낸다sleep 100 &
  • |와 ||, &와 &&는 전혀 다른 기호다. 한 글자 차이로 뜻이 바뀐다.
  • 성공·실패의 기준은 어제 본 종료 상태 $? 다. 0이면 성공이다.

자주 함께 쓰는 필터

명령하는 일
sort정렬 (-r 역순, -n 숫자순)
uniq연속된 중복 줄 제거 (보통 sort 뒤에)
wc줄·단어·글자 수
head / tail앞 / 뒤 일부
grep조건에 맞는 줄
cut열 잘라내기 (-d 구분자, -f 필드)
tee화면에 보여 주면서 파일에도 저장
cut -d: -f1 /etc/passwd | sort        # 사용자 이름만 뽑아 정렬
ls -l | tee list.txt                  # 보면서 저장까지
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rn
#      24 /sbin/nologin
#       3 /bin/bash
#       1 /sbin/shutdown
#       1 /sbin/halt
#       1 /bin/sync
  • 로그인 셸(7번째 필드)만 뽑아 → 정렬하고 → 같은 것끼리 세고 → 많은 순으로 다시 정렬했다. 작은 명령을 파이프로 이어 큰 일을 하는 전형적인 꼴이다.
  • uniq는 붙어 있는 줄끼리만 비교한다. 떨어져 있는 중복은 못 잡으므로 sort를 먼저 거친다. -c는 개수를 함께 보여 준다.
  • wc는 -l 줄, -w 단어, -c 바이트 수다.
  • tee는 기본이 덮어쓰기다. 이어 붙이려면 tee -a 를 쓴다.

와일드카드

기호뜻
*글자 몇 개든 (0개 포함)
?한 글자
[abc]괄호 안의 한 글자
[a-z]범위 안의 한 글자
[!abc]괄호 안의 글자가 아닌 한 글자
ls *.txt          # txt 로 끝나는 전부
ls a?.txt         # a1.txt, ab.txt — a 다음 한 글자
ls [ab]*.txt      # a 나 b 로 시작하는 txt
  • *와 ?의 차이가 시험 포인트다. *는 개수 제한이 없고 ?는 딱 한 글자다.
ls
# a.txt  a1.txt  a12.txt  b1.txt  note.md
ls a?.txt         # a1.txt                  ← a.txt(0글자)와 a12.txt(2글자)는 빠진다
ls a*.txt         # a.txt  a1.txt  a12.txt
ls [!a]*          # b1.txt  note.md
ls *.xyz
# ls: cannot access '*.xyz': No such file or directory
  • 와일드카드를 파일 이름으로 바꾸는 것은 셸이다. 맞는 파일이 하나도 없으면 *.xyz 라는 글자 그대로 명령에 넘어가 위와 같은 오류가 난다.
  • *는 점(.)으로 시작하는 숨김 파일에 맞지 않는다. 숨김 파일은 ls .* 처럼 점을 직접 적는다.
  • 셸이 풀지 못하게 하려면 따옴표로 감싼다. find . -name "*.txt" 에 따옴표를 붙이는 이유다 — *를 셸이 아니라 find가 해석해야 한다.

⚠️ 와일드카드와 정규 표현식은 다르다. 파일 이름에 쓰는 *는 "아무 글자 몇 개든"이지만, grep의 정규 표현식에서 *는 "바로 앞 글자가 0번 이상 반복"이다. 정규 표현식에서 "아무 글자 하나"는 . 이다.

별칭 — alias

alias                       # 지금 설정된 별칭 목록
alias ll='ls -alh'          # 만들기
alias rm='rm -i'            # 지울 때 물어보게
unalias ll                  # 지우기
\ls                         # 별칭을 무시하고 원래 명령 실행
  • unalias가 삭제 명령이다. 이름을 그대로 기억한다.
  • 등호 양옆에 공백을 넣지 않는다. 변수와 같은 규칙이다.
  • 명령으로 만든 별칭은 셸을 닫으면 사라진다. 계속 쓰려면 ~/.bashrc 에 적는다.
alias
# alias cp='cp -i'
# alias ll='ls -l --color=auto'
# alias ls='ls --color=auto'
# alias mv='mv -i'
# alias rm='rm -i'
alias ll
# alias ll='ls -l --color=auto'
type ll
# ll is aliased to `ls -l --color=auto'
  • 별칭은 같은 이름의 실제 명령보다 먼저 적용된다. 위 환경에서 rm을 치면 rm -i가 실행되어 지우기 전에 묻는다.
별칭을 건너뛰는 방법예
앞에 역슬래시\rm file
절대 경로로 실행/usr/bin/rm file
command 를 앞에command rm file
  • 값에 공백이나 옵션이 들어가면 따옴표로 감싼다. alias ll=ls -l 은 오류다.
  • unalias -a 는 설정된 별칭을 전부 지운다.
  • 별칭은 export로 넘길 수 없다. 자식 셸과 스크립트에는 전달되지 않으므로 셸을 띄울 때마다 읽히는 ~/.bashrc에 적는다.

히스토리

history               # 실행한 명령 목록 (번호와 함께)
history 10            # 최근 10개
!!                    # 직전 명령 다시 실행
!25                   # 25번 명령 다시 실행
!ls                   # ls 로 시작하는 가장 최근 명령
history -c            # 목록 지우기
표기하는 일
!!직전 명령 재실행
!번호그 번호의 명령 재실행
!문자열그 문자열로 시작하는 최근 명령
Ctrl+R입력하며 거슬러 검색
  • 이력은 ~/.bash_history 에 저장되고, 개수는 환경 변수 HISTSIZE 가 정한다.
  • sudo !! 는 "방금 명령을 sudo 붙여 다시"라는 흔한 관용구다.
표기하는 일
!$직전 명령의 마지막 인자
!-2두 번째 전 명령 재실행 (!-1은 !!와 같다)
!?문자열?그 문자열을 포함하는 최근 명령
^옛^새직전 명령에서 글자를 바꿔 재실행
mkdir /var/www/project
cd !$                   # cd /var/www/project 로 실행된다
history | tail -3
#   101  mkdir /var/www/project
#   102  cd /var/www/project
#   103  history | tail -3
  • !!는 명령 전체, !$는 마지막 인자 하나다. !로 시작하는 표기는 실행 전에 실제 명령으로 바뀌어 화면에 한 번 보인 뒤 실행된다.
변수·파일역할
HISTSIZE셸이 메모리에 기억하는 명령 개수
HISTFILESIZE파일에 남기는 줄 수
HISTFILE이력 파일의 위치 (기본값 ~/.bash_history)
  • 이력은 치는 즉시 파일에 쌓이지 않는다. 셸을 끝낼 때 ~/.bash_history에 기록된다. 터미널을 두 개 열어 두면 서로의 방금 명령이 보이지 않는 이유다.
  • HISTSIZE의 값은 배포판 설정마다 다르다. 레드햇 계열은 /etc/profile에서 1000으로 정해 둔다.

입력을 돕는 키

키하는 일
Tab명령·파일 이름 자동 완성 (두 번 누르면 후보 목록)
↑ / ↓이전 / 다음 명령 불러오기
Ctrl+A / Ctrl+E줄의 맨 앞 / 맨 끝으로
Ctrl+U커서 앞을 전부 지우기
Ctrl+L화면 지우기 (clear와 같다)
Ctrl+C입력하던 줄이나 실행 중인 명령을 취소
Ctrl+D입력의 끝. 빈 프롬프트에서 누르면 로그아웃

이렇게 이어 붙인 명령들을 파일에 적어 두고 한 번에 실행하는 것이 셸 스크립트다. 작성법은 1급 범위이므로 여기서는 이름만 알아 둔다.

내일은 이번 주의 셸 내용을 한 장으로 묶어 정리한다.

📖 용어

  • 표준 입력(stdin, 0) : 명령이 입력을 받는 통로. 기본은 키보드다.
  • 표준 출력(stdout, 1) : 명령이 결과를 내보내는 통로. 기본은 화면이다.
  • 표준 에러(stderr, 2) : 오류 메시지가 나가는 통로. 출력과 별개다.
  • 리다이렉션 : 입출력의 방향을 파일 등으로 바꾸는 것. >, >>, 2>, <.
  • /dev/null : 보낸 내용을 버리는 특수 장치 파일.
  • 파이프(|) : 앞 명령의 출력을 뒤 명령의 입력으로 넘기는 기호.
  • 별칭(alias) : 긴 명령에 짧은 이름을 붙이는 기능. unalias로 지운다.
  • 히스토리 : 실행한 명령의 이력. ~/.bash_history에 저장된다.

📝 연습 문제

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

문제 1

다음 중 명령의 실행 결과를 기존 파일의 내용을 지우지 않고 끝에 이어서 저장하는 기호로 알맞은 것은?

문제 2

다음 중 명령 실행 중 발생한 오류 메시지만 파일로 저장하는 기호로 알맞은 것은?

문제 3

다음 중 표준 입력, 표준 출력, 표준 에러의 파일 디스크립터 번호를 순서대로 바르게 나열한 것은?

문제 4

다음 중 설정된 별칭을 해제하는 명령으로 알맞은 것은?

문제 5

다음 중 바로 직전에 실행한 명령을 다시 실행하는 표기로 알맞은 것은?

이전환경 설정 파일Week 5 · Day 3다음 Week 5 종합 복습: 셸 한 장 정리Week 5 · Day 5

참고 공식 자료

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

이 페이지

  • 세 개의 통로
  • 출력 방향 돌리기
  • 에러만 따로
  • 2>&1`은 적는 순서가 중요하다
  • 덮어쓰기 사고를 막는 noclobber
  • 입력 방향 돌리기
  • 파이프로 잇기
  • 명령을 잇는 다른 기호
  • 자주 함께 쓰는 필터
  • 와일드카드
  • 별칭 — alias
  • 히스토리
  • 입력을 돕는 키
  • 용어
  • 연습 문제