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는 같은 것이 아니야.

기억할 연결
shBourne shell 계열의 출발점. 현재 /bin/sh의 실제 구현은 시스템마다 다름
bashBourne Again SHell, sh 계열 확장
kshKorn shell
cshC shell, C와 유사한 문법
tcshcsh 확장
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기본 프롬프트 형식
HISTSIZEBash 메모리 이력에 유지할 명령 개수

명령 이름에 /가 없으면 셸은 내장 명령 등의 해석을 거쳐 외부 명령을 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].txtfile1.txt 또는 file2.txt
{a,b}.txtBash 중괄호 확장. 파일 존재와 무관하게 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 | ba의 표준출력을 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! 변경 버리고 종료.

회상점검 — 한 번만

자료를 덮고 짧게 답하면 돼. 모르는 것은 모른다고 쓰면 되고, 답변 뒤에는 필요한 교정만 하고 넘어갈게.

  1. 절대경로와 상대경로의 차이는? cd ..와 cd -는 각각 어디로 가나?
  2. find·locate·grep은 무엇을 어떻게 찾는가?
  3. export하면 무엇이 달라지나? bash file.sh와 source file.sh의 차이는?
  4. 로그인 Bash의 사용자 설정 파일 세 개는 모두 읽나? 대화형 비로그인 Bash는 무엇을 읽나?
  5. echo '$HOME'echo "$HOME"의 출력 차이는?
  6. ·>>·파이프의 차이는? 표준오류 번호는?

  7. sort 뒤에 uniq -c를 연결하는 이유는? grep -c는 무엇을 세나?
  8. vi에서 입력 모드 진입·일반 모드 복귀·저장 종료·저장하지 않고 종료하는 키나 명령은?

출처 대조 범위

2026-09-09 작성. Vim 공식 참조 본문 확인. GNU 문서는 검색 결과로 일부 내용 확인했으나 본문 조회 시간 초과로 전체 대조 미완료. 예제 실행 검증 및 공식 시험 세부항목 전수 대조는 미실행. 실제 문제는 사용하지 않음.