- 모든 명령에는 표준 입력(0) · 표준 출력(1) · 표준 에러(2) 세 통로가 있다.
>는 덮어쓰기,>>는 이어 붙이기다. 이 둘을 바꿔 쓰면 파일이 날아간다.- 에러는
2>로 따로 돌린다.>만으로는 에러 메시지가 파일에 담기지 않는다. - 별칭은
alias, 지우기는unalias다. 유지하려면~/.bashrc에 적는다. - 히스토리는
history로 보고,!!(직전) ·!번호로 다시 실행한다.
기준: 리눅스마스터 2급 출제 기준오류 제보
>는 덮어쓰기, >>는 이어 붙이기다. 이 둘을 바꿔 쓰면 파일이 날아간다.2>로 따로 돌린다. >만으로는 에러 메시지가 파일에 담기지 않는다.alias, 지우기는 unalias 다. 유지하려면 ~/.bashrc에 적는다.history 로 보고, !!(직전) · !번호 로 다시 실행한다. ┌─────────────┐
표준 입력 (0) ─►│ 명령 │─► 표준 출력 (1) 결과
키보드 │ │─► 표준 에러 (2) 오류 메시지
└─────────────┘ 화면| 이름 | 번호 | 기본 연결 |
|---|---|---|
| 표준 입력 (stdin) | 0 | 키보드 |
| 표준 출력 (stdout) | 1 | 화면 |
| 표준 에러 (stderr) | 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 directory2>&1은 "지금 1번이 향하는 곳으로 2번도 보내라"는 뜻이다.2>&1 시점에 1번이 아직 화면을 향하고 있다. 그 뒤에 1번만 파일로 바뀌므로 에러는 화면에 남는다.&를 빼고 2>1 이라고 쓰면 에러가 1 이라는 이름의 파일에 저장된다.| 표기 | 표준 출력이 가는 곳 | 표준 에러가 가는 곳 |
|---|---|---|
명령 > a | a | 화면 |
명령 2> a | 화면 | a |
명령 > a 2> b | a | b |
명령 > a 2>&1 | a | a |
명령 &> a | a | a |
명령 2>&1 > a | a | 화면 |
명령 > /dev/null 2>&1 | 버림 | 버림 |
>는 1>을 줄여 쓴 것이다. 번호를 생략하면 1번(표준 출력) 이다.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.txt | ls | grep txt |
find / -name "*.conf" | wc -l # 에러 메시지는 파이프를 타지 않고 화면에 그대로 나온다
find / -name "*.conf" 2> /dev/null | wc -l # 에러는 버리고 개수만 센다
find / -name "*.conf" 2>&1 | grep denied # 에러까지 파이프로 넘긴다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/syncuniq는 붙어 있는 줄끼리만 비교한다. 떨어져 있는 중복은 못 잡으므로 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 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급 범위이므로 여기서는 이름만 알아 둔다.
내일은 이번 주의 셸 내용을 한 장으로 묶어 정리한다.
>, >>, 2>, <./dev/null : 보낸 내용을 버리는 특수 장치 파일.|) : 앞 명령의 출력을 뒤 명령의 입력으로 넘기는 기호.unalias로 지운다.~/.bash_history에 저장된다.선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
다음 중 명령의 실행 결과를 기존 파일의 내용을 지우지 않고 끝에 이어서 저장하는 기호로 알맞은 것은?
문제 2
다음 중 명령 실행 중 발생한 오류 메시지만 파일로 저장하는 기호로 알맞은 것은?
문제 3
다음 중 표준 입력, 표준 출력, 표준 에러의 파일 디스크립터 번호를 순서대로 바르게 나열한 것은?
문제 4
다음 중 설정된 별칭을 해제하는 명령으로 알맞은 것은?
문제 5
다음 중 바로 직전에 실행한 명령을 다시 실행하는 표기로 알맞은 것은?