1. 명령을 읽는 법
명령을 외우는 것보다 모르는 명령을 5초 만에 알아내는 것이 오래 간다
이 장에서 처음 나오는 말5개
manmanual- 시스템에 설치된 모든 명령·설정 파일의 공식 설명서. 인터넷보다 이 서버에 실제로 깔린 버전에 맞다는 것이 결정적 장점이다.
stdout / stderrstandard output / standard error- 프로그램이 결과를 내보내는 통로 두 개. 정상 결과는 stdout(번호 1), 오류 메시지는 stderr(번호 2)로 나간다. 오류가 파이프를 안 타고 화면에만 남는 이유다.
종료 코드exit status / exit code- 명령이 끝나면서 남기는 정수. 0이 성공, 그 외는 실패다. 화면에는 안 보이고
$?에 들어 있다 — 스크립트와&&연결의 판단 근거다. 글로브glob*·?·[…]로 파일 이름을 골라내는 셸의 패턴. 셸이 먼저 펼쳐서 명령에 넘긴다 — 정규식이 아니고, 따옴표로 감싸면 안 펼쳐진다.PATH- 실행 파일을 찾을 디렉터리 목록.
sudo는 보안 때문에 자기만의 PATH(secure_path) 를 쓴다 — "일반 계정에선 되는데 sudo로는 command not found"의 정체다.
모르는 명령을 만났을 때
섹션 제목: “모르는 명령을 만났을 때”-
한 줄 설명부터 — 무슨 물건인지
터미널 창 whatis ss # ss (8) - another utility to investigate socketsapropos socket # 키워드로 관련 명령 찾기 (whatis -k와 같다) -
빠른 사용법은
--help— man보다 짧고, 대부분의 명령이 지원한다터미널 창 ss --helpjournalctl --help | less -
정확한 것은
man— 옵션의 의미와 기본값이 여기 있다터미널 창 man ssman 5 crontab # 섹션 지정 (아래 표)man 안에서는
/검색어→n(다음) →q(종료). 이 셋이면 충분하다. -
예제만 급하면
tldr— 커뮤니티가 쓴 사용 예 모음 (별도 설치)터미널 창 sudo apt install -y tldr && tldr ss
man 섹션 — man 5 crontab의 5
섹션 제목: “man 섹션 — man 5 crontab의 5”같은 이름이 명령으로도, 설정 파일로도 존재하는 일이 흔하다. 그때 섹션 번호로 가른다.
| 섹션 | 내용 | 예 |
|---|---|---|
| 1 | 일반 사용자 명령 | man 1 crontab — crontab -e 명령 |
| 5 | 설정 파일 형식 | man 5 crontab — 크론 파일에 뭘 어떻게 쓰나 |
| 8 | 관리자 명령 (root용) | man 8 ss · man 8 useradd |
| 7 | 개념·규약 | man 7 hier — 디렉터리 구조 설명 |
man -a crontab은 섹션을 모두 순서대로 보여준다. man -k 는 apropos와 같다.
이 명령이 대체 뭔가 — type
섹션 제목: “이 명령이 대체 뭔가 — type”type ll # ll is aliased to `ls -alF' ← 별칭type cd # cd is a shell builtin ← 셸 내장 (man cd가 없는 이유)type -a python3 # 경로 전부. PATH에 여러 개 있을 때 어느 것이 잡히는지command -v ss # 스크립트에서 "설치돼 있나" 확인용 (있으면 경로, 없으면 종료코드 1)히스토리를 보다가 입력줄 비우기
섹션 제목: “히스토리를 보다가 입력줄 비우기”위·아래 화살표로 이전 명령을 찾다가 새 명령을 처음부터 쓰고 싶다면, 현재 입력을 고칠 것인지 아예 취소할 것인지에 따라 단축키를 고른다. 아래 화살표로 최신 항목까지 왔는데도 글자가 남는 것은 히스토리 탐색을 시작하기 전에 입력하던 내용이 복원된 경우가 많다.
| 키 | 동작 | 언제 쓰나 |
|---|---|---|
Ctrl+U | 커서부터 줄 시작까지 삭제 | 커서가 끝에 있을 때 현재 명령 전체를 지우고 다시 입력 |
Ctrl+A → Ctrl+K | 줄 시작으로 이동한 뒤 끝까지 삭제 | 커서 위치와 관계없이 입력줄 전체를 확실히 삭제 |
Ctrl+C | 현재 입력을 취소하고 새 프롬프트 표시 | 히스토리·여러 줄 입력 상태까지 버리고 완전히 다시 시작 |
Ctrl+L | 화면을 정리하되 현재 입력은 유지 | 출력만 치우고 쓰던 명령은 계속 편집 |
따라서 기존 입력을 편집해서 다시 쓸 때는 Ctrl+U, 입력 자체를 버리고 새 프롬프트에서
시작할 때는 **Ctrl+C**가 기준이다. Ctrl+L은 입력줄 삭제가 아니라 화면 정리라는 점을 구분한다.
종료 코드와 명령 연결
섹션 제목: “종료 코드와 명령 연결”성공/실패는 화면 메시지가 아니라 종료 코드로 판정한다. 자동화의 전부가 여기 달려 있다.
systemctl is-active nginxecho $? # 0이면 실행 중, 3이면 아님| 연결 | 의미 |
|---|---|
A && B | A가 성공(0) 해야 B를 실행 |
A || B | A가 실패해야 B를 실행 |
A ; B | 결과와 무관하게 순서대로 |
A & | A를 백그라운드로 (터미널을 닫으면 대개 죽는다 — 4장) |
관용구 두 개만 외운다 — apt update && apt upgrade(앞이 실패하면 진행하지 않는다),
command -v mtr || sudo apt install -y mtr-tiny(없으면 설치).
출력 다루기 — 파이프와 리다이렉션
섹션 제목: “출력 다루기 — 파이프와 리다이렉션”ss -tulpn | grep 443 # stdout을 다음 명령의 입력으로dmesg > /tmp/dmesg.txt # 덮어쓰기 (>> 는 이어쓰기)apt install foo 2> err.log # stderr만 파일로make 2>&1 | tee build.log # stderr를 stdout에 합쳐 화면 + 파일 동시에journalctl -u ssh | wc -l # 줄 수만자주 쓰는 조합 다섯
섹션 제목: “자주 쓰는 조합 다섯”grep -rn "proxy" /etc/apt/ # 재귀(-r) + 줄번호(-n). "이 설정 어디 있지"의 답grep -i -A3 -B1 error /var/log/syslog # 대소문자 무시 + 앞뒤 줄 같이ps aux | awk '$3 > 50 {print $2, $11}' # CPU 50% 넘는 것의 PID와 명령sort | uniq -c | sort -rn | head # 빈도 상위 — 로그 분석의 만능 꼬리ss -tulpn | column -t # 열 정렬해서 읽기 좋게긴 출력은 less -S(줄 안 접기)로 본다. 반복 확인은 watch -n1 'ss -s'.
오래 걸리는 명령에는 timeout 5 curl …로 상한을 건다 — 진단할 때 특히 유용하다.
sudo — 권한만 빌리는 게 아니다
섹션 제목: “sudo — 권한만 빌리는 게 아니다”sudo는 환경변수와 PATH도 바꾼다. 이걸 모르면 프록시(9장) 설정에서
반드시 한 번 막힌다.
| 상황 | 결과 | 대처 |
|---|---|---|
sudo curl …인데 프록시를 안 탄다 | sudo가 http_proxy 환경변수를 버렸다 | sudo -E curl … 또는 sudoers의 env_keep |
일반 계정은 되는데 sudo foo는 command not found | sudo의 secure_path에 그 디렉터리가 없다 | 전체 경로로 실행 (sudo /usr/local/bin/foo) |
sudo echo x > /root/f 가 Permission denied | 리다이렉션은 sudo 밖의 셸이 한다 | echo x | sudo tee /root/f |
| 잠깐이 아니라 계속 root로 | — | sudo -i(root의 환경까지) · sudo -s(현재 환경 유지) |
sudo -l로 내가 무엇을 할 수 있는지 확인할 수 있다. 자세한 설정은 10장.
사고를 줄이는 습관 다섯
섹션 제목: “사고를 줄이는 습관 다섯”- 되돌릴 수 없는 명령 앞에서는 목록부터 본다 —
rm전에 같은 조건으로ls,find … -delete전에-print --dry-run·-n을 먼저 찾는다 —rsync -n·apt -s upgrade·logrotate -d- 설정 파일은 고치기 전에 복사한다 —
sudo cp /etc/ssh/sshd_config{,.bak-$(date +%F)}(중괄호 확장으로sshd_config→sshd_config.bak-2026-08-10) - 문법 검사기가 있으면 쓴다 —
sshd -t·nginx -t·visudo·netplan try - 원격에서 접속을 끊을 수 있는 작업은
tmux/screen안에서 한다 — 세션이 끊겨도 명령은 계속 돈다
1장 요약
섹션 제목: “1장 요약”- 모르는 명령은
whatis→--help→man순서. 설정 파일 형식은man 5 - 성공/실패는 종료 코드
$?로 판정한다 —&&·||가 여기 붙는다 - 오류가 파이프를 안 타면 stderr다 —
2>&1을 파이프 앞에 붙인다 sudo는 환경변수와 PATH를 갈아치운다 —sudo -E, 리다이렉션은| sudo tee- 바꾸기 전에
ls· 백업 ·--dry-run· 문법 검사