02/11 — 기본 명령어·에디터·셸
이번 단원의 중심은 셸이 명령을 해석하고, 여러 명령이 파일과 텍스트를 처리하는 흐름이야. 2급 기초부터 1급에서 구별할 설정·옵션까지 한 번에 간다. 예제는 Linux의 Bash 기준이며 지금 실행할 필요는 없어.
1. 경로와 기본 명령어
ls -l /etc는 명령 ls에 상세 출력 옵션 -l과 대상 /etc를 주는 형태야. 대소문자를 구별하고, 옵션 의미는 명령마다 다르다.
| 표현 | 의미 |
|---|---|
/etc/hosts | /에서 시작하는 절대경로 |
docs/note.txt | 현재 디렉터리 기준 상대경로 |
. / .. | 현재 / 부모 디렉터리 |
~ | 셸이 홈 디렉터리 경로로 확장 |
pwd | 현재 작업 디렉터리 출력 |
cd / cd ~ | 홈으로 이동 |
cd - | 직전 작업 디렉터리로 이동 |
현재 위치가 /home/student라면 cd ../shared는 /home/shared로 이동한다. 상대경로는 현재 위치에 따라 가리키는 곳이 달라져.
| 명령 | 역할·핵심 옵션 |
|---|---|
ls | 목록. -a 숨김 포함, -l 상세, -h 읽기 쉬운 크기, -R 하위까지 |
mkdir -p a/b | 필요한 부모 디렉터리까지 생성 |
rmdir dir | 빈 디렉터리 삭제 |
touch file | 접근·수정 시각 갱신. 없으면 보통 빈 파일 생성 |
cp a b | 복사. -r 디렉터리 재귀, -a 속성 보존 등을 포함한 아카이브 복사, -i 덮어쓰기 확인 |
mv a b | 이동·이름 변경. -i 덮어쓰기 확인 |
rm file | 삭제. -r 재귀 삭제, -f 확인 없이 처리·없는 대상 무시 |
file file | 내용 등의 특징으로 파일 종류 판별 |
rm은 기본적으로 휴지통으로 보내지 않는다. 삭제 예제는 실행하지 않아도 돼.
내용을 볼 때는 cat이 내용을 이어 출력하고, less는 페이지 단위로 탐색하며 q로 종료한다. head -n 5 file은 앞 5줄, tail -n 5 file은 뒤 5줄이고 둘의 기본은 10줄이다. tail -f file은 뒤에 추가되는 내용을 계속 보여준다.
도움말은 man 명령. man 5 passwd처럼 절을 지정할 수 있어. 1 사용자 명령, 5 파일 형식, 8 시스템 관리 명령을 우선 구별하자.
무엇을 찾는가
type: 셸이 명령을 별칭·내장 명령·실행 파일 중 무엇으로 해석하는지 확인.which: 보통 PATH에서 실행 파일 검색. 셸 해석 확인은 type이 더 적절.whereis: 실행 파일·소스·매뉴얼 위치 검색.locate: 미리 만든 DB에서 파일 경로 검색. 빠르지만 최신 변경이 누락될 수 있으며updatedb로 DB 갱신.find: 지정한 디렉터리 아래를 실제 탐색하면서 조건 검사.
find /etc -type f -name '*.conf'/etc 아래의 일반 파일(-type f) 중 이름이 .conf로 끝나는 것을 찾는다. -type d는 디렉터리, -iname은 대소문자 무시다. 따옴표는 *셸이 먼저 .conf를 파일명으로 바꾸지 않고 find에 패턴을 그대로 넘기기 위해서 쓴다.
2. 셸의 종류와 역할
터미널은 입력과 출력을 주고받는 창·환경이고, 셸은 명령을 해석하는 프로그램이다. 터미널과 Bash는 같은 것이 아니야.
| 셸 | 기억할 연결 |
|---|---|
| sh | Bourne shell 계열의 출발점. 현재 /bin/sh의 실제 구현은 시스템마다 다름 |
| bash | Bourne Again SHell, sh 계열 확장 |
| ksh | Korn shell |
| csh | C shell, C와 유사한 문법 |
| tcsh | csh 확장 |
| zsh | 다양한 대화형 기능 |
Bash는 name=value를 쓰지만 csh 계열은 set, 환경변수는 setenv 등 문법이 다르다.
/etc/shells는 등록된 로그인 셸 목록, chsh는 로그인 셸 변경 명령이다. $SHELL은 보통 로그인 셸 경로이지 현재 실행 중인 셸을 항상 보장하지 않는다. echo "$0"는 현재 셸 또는 스크립트의 호출 이름 확인에 참고한다.
내장 명령은 셸 자체의 기능, 외부 명령은 별도 실행 파일이다. cd는 현재 셸의 위치를 바꾸어야 하므로 내장 명령이다. 자식 프로그램이 자기 위치를 바꾸어도 부모 셸의 위치는 바뀌지 않아.
3. 변수·환경변수·시작 파일
topic=linux
echo "$topic"
export topic
unset topic대입은 등호 양옆에 공백 없이 쓴다. $topic은 변수 값으로 확장된다. export하면 이후 실행하는 자식 프로그램의 환경에도 전달한다. 자식이 값을 바꾸어도 부모 값이 거꾸로 바뀌지 않는다.
| 변수 | 의미 |
|---|---|
| HOME | 홈 디렉터리 |
| PATH | 실행 파일 검색 디렉터리 목록. 콜론으로 구분 |
| PWD / OLDPWD | 현재 / 직전 작업 디렉터리 |
| USER / SHELL | 보통 사용자 이름 / 로그인 셸 경로 |
| LANG / LC_ALL | 로캘 설정. LC_ALL은 범주별 설정을 일괄 재정의 |
| PS1 | 기본 프롬프트 형식 |
| HISTSIZE | Bash 메모리 이력에 유지할 명령 개수 |
명령 이름에 /가 없으면 셸은 내장 명령 등의 해석을 거쳐 외부 명령을 PATH에서 찾는다. 현재 디렉터리가 자동 검색되는 것은 아니므로 현재 위치의 프로그램은 보통 ./program으로 실행한다.
env·printenv는 환경 확인, 인자 없는 Bash의 set은 셸 변수와 함수 등도 출력한다. alias ll='ls -l'은 별칭, unalias ll은 해제다.
Bash 시작 파일
로그인 여부와 대화형 여부는 별개의 구분이야. 보통의 대화형 Bash부터 보자.
| 상황 | 읽는 파일 |
|---|---|
| 로그인 Bash | /etc/profile 다음, ~/.bash_profile → ~/.bash_login → ~/.profile 중 처음 존재하고 읽을 수 있는 하나 |
| 대화형 비로그인 Bash | ~/.bashrc |
| 로그인 Bash 종료 | ~/.bash_logout이 있으면 실행 |
로그인 Bash가 사용자 파일 세 개를 모두 읽는 것은 아니야. 로그인 설정 파일에서 .bashrc를 불러오게 작성하는 것은 흔하지만, 자동 읽기 규칙과는 구별해야 한다. /etc/bashrc, /etc/bash.bashrc 같은 공통 파일의 이름과 연결은 배포판마다 다르다. 비대화형 Bash에는 BASH_ENV 등 별도 규칙이 적용된다. GNU 시작 파일
bash settings.sh는 새 Bash에서 실행한다. source settings.sh 또는 . settings.sh는 현재 셸에서 실행하므로 변수 설정·디렉터리 이동 결과가 현재 셸에 남을 수 있다.
4. 인용·확장·정규표현식
셸은 명령에 인자를 넘기기 전에 변수·파일명 패턴 등을 해석한다. 따옴표는 그 해석의 범위를 제어한다.
topic=linux
echo '$topic'
echo "$topic"첫 출력은 문자 그대로 topic, 두 번째는 linux다. **작은따옴표는 문자 그대로, 큰따옴표는 변수·명령 치환을 허용하면서 공백 분리와 파일명 확장을 막는다.** 그래서 파일명 변수를 쓸 때는 `"file”`처럼 감싸는 것이 기본이다. 따옴표 밖의 역슬래시는 보통 다음 문자의 특수 의미를 제거한다. GNU 인용
| 표현 | 의미 |
|---|---|
${topic}_note | 변수 이름의 경계를 분명히 해서 확장 |
$(date +%F) | 명령의 표준출력을 가져오는 명령 치환 |
$((2 + 3)) | 산술 확장, 5 |
*.log | .log로 끝나는 파일명 패턴 |
file?.txt | ? 자리에 한 글자 |
file[12].txt | file1.txt 또는 file2.txt |
{a,b}.txt | Bash 중괄호 확장. 파일 존재와 무관하게 a.txt, b.txt 생성 |
보통 *는 이름 첫 글자가 점인 숨김 파일을 포함하지 않는다. Bash 기본 설정에서는 일치 파일이 없는 패턴이 그대로 남는다. 관련 셸 옵션으로 달라질 수 있어.
파일명 패턴의 *는 임의의 문자열, 정규표현식의 *는 바로 앞 요소를 0번 이상 반복이다. 정규표현식의 점은 임의의 한 문자, .*는 임의 문자 0개 이상, ^는 행 시작, $는 행 끝이다.
grep '^root:' /etc/passwd는 root:로 시작하는 행을 찾는다. grep 패턴은 셸 파일명 패턴과 문법이 다르다. GNU Grep 사용법
5. 리다이렉션과 파이프
| 번호 | 통로 | 보통 연결 |
|---|---|---|
| 0 | 표준입력 stdin | 키보드/터미널 |
| 1 | 표준출력 stdout | 화면/터미널 |
| 2 | 표준오류 stderr | 화면/터미널 |
화면에 같이 보여도 출력과 오류는 별도 통로다.
| 문법 | 의미 |
|---|---|
cmd > out | 표준출력을 파일로. 보통 기존 내용 덮어씀 |
cmd >> out | 파일 끝에 추가 |
cmd < input | 파일을 표준입력으로 |
cmd 2> err | 오류만 파일로 |
cmd > out 2>&1 | 출력과 오류를 함께 out으로 |
cmd > /dev/null | 출력 버림. 오류는 별도 |
a | b | a의 표준출력을 b의 표준입력에 연결 |
>는 출력 위치 변경, 파이프는 명령 간 연결이야. 기본 파이프는 표준오류까지 보내지 않는다.
리다이렉션은 왼쪽부터 처리한다. cmd > out 2>&1은 1번을 파일로 보낸 뒤 2번도 그곳에 연결한다. 반면 cmd 2>&1 > out은 2번을 당시 1번 위치(보통 터미널)에 연결한 뒤 1번만 파일로 바꾼다. GNU 리다이렉션
<<EOF는 끝 표시까지 여러 줄을 입력으로 주는 here-document다. tee out은 입력을 표준출력과 파일 양쪽으로 보내며 -a는 파일에 추가한다. 같은 파일을 읽으며 > 같은파일로 출력하면 읽기 전에 내용이 비워질 수 있으므로 원본과 출력을 분리해야 한다.
6. 텍스트 처리
| 명령 | 역할·옵션 |
|---|---|
| grep | 행 선택. -i 대소문자 무시, -v 불일치, -n 행 번호, -c 일치 행 수, -r 재귀, -E 확장 정규식, -F 고정 문자열 |
| cut | 필드·문자 위치 추출. -d 구분자, -f 필드, -c 문자 위치 |
| sort | 정렬. -n 수치, -r 역순, -k 키, -t 필드 구분자 |
| uniq | 인접 중복 처리. -c 횟수, -d 중복 그룹만 |
| wc | -l 줄바꿈 수, -w 단어 수, -c 바이트 수, -m 문자 수 |
| tr | 표준입력의 문자 변환. -d 삭제, -s 반복 문자 압축 |
| sed | 행 선택·삭제·치환 등 스트림 편집 |
| awk | 필드 분리·조건·계산·출력 |
grep -c는 단어 총출현 횟수가 아니라 일치 행 수다. uniq는 인접 중복만 처리하므로 떨어진 중복까지 모으려면 먼저 정렬한다. sort의 기본은 수치 정렬이 아니므로 숫자 비교에는 -n을 준다. GNU sort
cut -d: -f1 /etc/passwd
awk -F: '{print $1}' /etc/passwd둘 다 콜론으로 나눈 첫 필드를 출력한다. awk의 1은 첫 필드, 0은 행 전체, NF는 현재 행의 필드 수, NR은 지금까지 읽은 레코드 수다. Bash의 1과 awk의 1은 해석 주체가 다르다.
sed 's/error/warning/g' sample.txt
sed -n '1,5p' sample.txt첫 명령은 각 행의 error를 warning으로 모두 치환해 출력한다. g가 없으면 각 행의 첫 일치만 치환한다. 두 번째는 기본 출력을 억제(-n)하고 1~5행을 출력(p)한다. 이 명령만으로 원본을 바꾸지는 않는다. GNU sed의 -i는 원본 편집이므로 구별해야 해. GNU sed
cut -d: -f7 /etc/passwd | sort | uniq -c이 흐름은 계정 파일의 일곱 번째 필드인 로그인 셸을 추출 → 같은 경로가 붙도록 정렬 → 경로별 계정 수 출력이다. 작은 명령을 연결해 더 큰 처리를 만든다.
7. vi/Vim과 에디터
vi는 키를 명령으로 해석하는 상태와 글자로 입력하는 상태가 다르다. Vim은 vi를 확장했다.
| 상태 | 용도·이동 |
|---|---|
| 일반 모드 | 이동·삭제·복사. Esc로 돌아오기 |
| 입력 모드 | 글 입력. 일반 모드에서 i·a·o 등으로 진입 |
| 명령행 모드 | 일반 모드에서 :로 시작. 저장·종료·설정 |
- i 커서 앞, a 뒤에서 입력. o 아래에 새 줄을 만들고 입력.
- h j k l은 왼쪽·아래·위·오른쪽. 0 행 처음, $ 행 끝, gg 문서 처음(Vim), G 문서 끝.
- x 한 문자 삭제, dd 한 줄 삭제, 3dd 세 줄 삭제. yy 한 줄 복사, p 붙여넣기.
- u 실행 취소, Ctrl+r 다시 실행(Vim). /문자열 앞으로 검색, ?문자열 뒤로 검색. n 같은 방향, N 반대 방향.
- :w 저장, :q 종료, :wq 저장 후 종료, :q! 변경 버리고 종료.
- :set nu 행 번호 표시, :set nonu 해제.
- :%s/old/new/g 전체 행의 모든 일치 치환. %는 전체 행, g는 행마다 모든 일치. 뒤에 c를 붙이면 치환마다 확인.
입력 모드에서 :wq를 타이핑하면 글자로 들어간다. 먼저 Esc로 일반 모드로 돌아와야 해. Vim 공식 참조
nano는 화면에 단축키 안내가 있는 간단한 에디터이며 ^는 Ctrl 표기다. Emacs는 확장성과 Ctrl·Meta 조합이 특징이고 C-x C-s는 저장, C-x C-c는 종료다. pico는 Pine 계열의 편집기이며 nano는 pico에서 영향을 받았다.
8. 셸 스크립트 읽기의 기초
셸은 여러 명령을 적은 파일도 실행한다. 첫 줄 #!/bin/bash는 직접 실행할 때 사용할 해석기를 지정한다. bash script.sh는 Bash를 명시해 파일을 읽는 방식이다.
| 표현 | 의미 |
|---|---|
| $0 | 스크립트·셸 호출 이름 |
1, 2 | 첫째·둘째 인자 |
| $# | 위치 인자 개수 |
| ”$@“ | 각 인자를 개별 인자로 유지 |
| ”$*“ | 보통 모든 인자를 하나의 문자열로 결합 |
| $? | 직전 명령의 종료 상태. 보통 0 성공 |
| $$ | 셸 PID |
a && b는 a 성공 시 b, a || b는 a 실패 시 b, a ; b는 성공 여부와 무관하게 차례로 실행한다.
조건식에서 -f는 일반 파일, -d는 디렉터리, -r은 읽기 가능 검사다. 숫자는 -eq 같음·-ne 다름·-gt 큼·-lt 작음, 문자열은 =·!=, 빈 문자열은 -z로 검사한다.
if [ -f "$1" ]; then
echo "일반 파일이다"
else
echo "일반 파일이 아니거나 확인할 수 없다"
fi대괄호 안쪽의 공백이 필요해. [ -f "$1" ]는 조건 검사 명령이고 if는 종료 상태에 따라 분기한다. 반복은 for …; do …; done, while 조건; do …; done, 패턴 분기는 case … in … esac 형태를 알아두자. 이번에는 복잡한 코딩보다 변수·인자·조건·종료 상태를 읽는 것이 우선이야.
필기용 압축
- 경로: / 절대, 현재 기준 상대, .. 부모, ~ 홈.
- 탐색: find 실제 탐색, locate DB, grep 내용의 행.
- 변수: 이름=값, export 자식 환경 전달, source 현재 셸 실행.
- 설정: 로그인 profile 계열, 대화형 비로그인 bashrc.
- 인용: 작은따옴표 문자 그대로, 큰따옴표 변수 확장 허용.
- 입출력: 0 입력·1 출력·2 오류. > 덮어쓰기, >> 추가, 파이프 명령 연결.
- 처리: grep 행, cut 필드, sort 정렬, uniq 인접 중복, sed 편집, awk 필드·계산.
- vi: Esc 일반, i 입력, :wq 저장 종료, :q! 변경 버리고 종료.
회상점검 — 한 번만
자료를 덮고 짧게 답하면 돼. 모르는 것은 모른다고 쓰면 되고, 답변 뒤에는 필요한 교정만 하고 넘어갈게.
- 절대경로와 상대경로의 차이는? cd ..와 cd -는 각각 어디로 가나?
- find·locate·grep은 무엇을 어떻게 찾는가?
- export하면 무엇이 달라지나? bash file.sh와 source file.sh의 차이는?
- 로그인 Bash의 사용자 설정 파일 세 개는 모두 읽나? 대화형 비로그인 Bash는 무엇을 읽나?
echo '$HOME'와echo "$HOME"의 출력 차이는?-
·>>·파이프의 차이는? 표준오류 번호는?
- sort 뒤에 uniq -c를 연결하는 이유는? grep -c는 무엇을 세나?
- vi에서 입력 모드 진입·일반 모드 복귀·저장 종료·저장하지 않고 종료하는 키나 명령은?
출처 대조 범위
2026-09-09 작성. Vim 공식 참조 본문 확인. GNU 문서는 검색 결과로 일부 내용 확인했으나 본문 조회 시간 초과로 전체 대조 미완료. 예제 실행 검증 및 공식 시험 세부항목 전수 대조는 미실행. 실제 문제는 사용하지 않음.