로그인하면 이런 줄이 뜬다. 이게 프롬프트, 명령을 기다린다는 표시다.
user@localhost:~$
│ │ ││
│ │ │└── $ = 일반 사용자, # = root
│ │ └─── 현재 디렉터리 (~ 는 홈 디렉터리)
│ └────────── 호스트명(컴퓨터 이름)
└───────────────── 로그인한 사용자 이름
$와 #의 구분이 가장 중요하다. 교재나 문서에서 #으로 시작하는 명령은 "관리자 권한으로 실행하라"는 뜻이다.
- root로 상시 로그인하지 않는 것이 원칙이다. 필요할 때만
sudo로 잠깐 권한을 올린다.
프롬프트는 PS1이라는 변수에 적힌 형식대로 그려진다. 배포판마다 기본값이 달라 같은 상황도 다르게 보인다.
| 계열 | 보이는 모양 | 특징 |
|---|
| RedHat 계열 (CentOS · Rocky) | [user@localhost ~]$ | 대괄호로 감싸고, 현재 디렉터리의 마지막 이름만 보여준다 |
| Debian 계열 (Ubuntu) | user@localhost:~$ | 콜론으로 잇고, 현재 디렉터리의 경로 전체를 보여준다 |
[user@localhost ~]$ cd /usr/share/doc
[user@localhost doc]$ su -
Password:
[root@localhost ~]#
- 시험 지문에는
[root@www ~]# 같은 RedHat 계열 모양이 쓰인다. 모양이 달라도 읽는 법은 같다 — 사용자, 호스트, 위치, 그리고 맨 끝의 $ / #.
- 위 예에서
/usr/share/doc으로 옮기자 위치 자리가 doc으로 바뀌었고, su -로 root가 되자 끝 글자가 #로 바뀌었다.
- 프롬프트의 각 토막은 명령으로도 확인할 수 있다.
whoami # user ← 로그인한 사용자 이름
hostname # localhost ← 호스트명
pwd # /home/user ← 현재 디렉터리의 전체 경로
$ ls -l /home
│ │ │
│ │ └── 인자(argument) — 무엇에 대해
│ └─────── 옵션(option) — 어떻게
└─────────── 명령어(command) — 무엇을
| 토막 | 설명 | 예 |
|---|
| 명령어 | 실행할 프로그램 이름 | ls, cp, mkdir |
| 옵션 | 동작 방식을 바꾼다. 보통 -로 시작 | -l, -a, --help |
| 인자 | 대상. 파일명·디렉터리·문자열 | /home, a.txt |
- 셸은 공백으로 토막을 나눈다. 그래서 파일명에 공백이 있으면 따옴표로 묶거나
\ 로 escape 해야 한다.
- 대소문자를 구분한다.
LS는 ls가 아니다.
- 옵션과 인자는 둘 다 생략할 수 있다.
ls만 쳐도 되고, ls /home처럼 옵션 없이 인자만 줘도 된다. 대괄호 [ ]가 "생략 가능"이라는 뜻이다.
touch my file.txt # my 와 file.txt, 파일이 두 개 생긴다
touch "my file.txt" # 공백이 든 파일 하나
touch my\ file.txt # 위와 같다 (\ 가 바로 뒤 공백 하나를 보호)
| 표기 | 셸이 하는 일 |
|---|
"..." 큰따옴표 | 공백은 보호하되 $변수는 값으로 바꾼다 |
'...' 작은따옴표 | 안의 글자를 전부 글자 그대로 둔다 |
\ 역슬래시 | 바로 뒤 한 글자만 보호한다 |
echo "$HOME" # /home/user ← 변수의 값이 나온다
echo '$HOME' # $HOME ← 글자 그대로 나온다
| 기호 | 뜻 | 예 |
|---|
; | 앞 명령의 성공 여부와 무관하게 차례로 실행 | cd /tmp; ls |
&& | 앞 명령이 성공했을 때만 뒤를 실행 | mkdir work && cd work |
|| | 앞 명령이 실패했을 때만 뒤를 실행 | cd work || echo "없음" |
| 형태 | 모양 | 특징 |
|---|
| 짧은 형(short) | -a | 한 글자. 여러 개를 묶을 수 있다 → -l -a = -la |
| 긴 형(long) | --all | 뜻이 분명하다. 묶을 수 없다 |
ls -l -a /home # 따로 쓰기
ls -la /home # 묶어 쓰기 — 같은 뜻
ls --all /home # 긴 형
함정: 긴 형은 --(하이픈 두 개) 로 시작한다. -all처럼 하이픈 하나로 쓰면 -a -l -l로 해석된다.
옵션 가운데는 뒤에 값이 따라붙는 것이 있다. 짧은 형은 띄어 쓰고, 긴 형은 =로 잇는 것이 보통이다.
head -n 5 a.txt # 짧은 형 + 값
head --lines=5 a.txt # 긴 형 + 값 — 같은 뜻
- 이때
5는 인자가 아니라 -n 옵션의 값이다. 명령이 처리할 대상(인자)은 a.txt 하나다.
- GNU 명령 대부분은
--help(사용법)와 --version(버전)을 공통으로 받는다. 옵션이 기억나지 않으면 명령어 --help부터 쳐 본다.
ls라고만 쳐도 실행되는 것은, 셸이 PATH 변수에 적힌 디렉터리를 앞에서부터 차례로 뒤져 같은 이름의 실행 파일을 찾아 주기 때문이다.
echo $PATH
# /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/bin
which cp
# /usr/bin/cp
우리가 치는 "명령"은 사실 세 종류다.
| 종류 | 설명 | 예 |
|---|
| 내장 명령(builtin) | 셸 프로그램 안에 들어 있는 명령. 별도 실행 파일이 필요 없다 | cd, echo, history, exit |
| 외부 명령 | 디스크에 실행 파일로 있는 명령. PATH에서 찾는다 | ls, cp, man |
| 별칭(alias) | 긴 명령에 붙여 둔 짧은 이름 | ll → ls -l |
type cd # cd is a shell builtin
type ls # ls is aliased to `ls --color=auto'
type cp # cp is /usr/bin/cp
command not found 가 나오면 셋 중 하나다 — 오타, 프로그램이 설치되지 않음, 실행 파일이 PATH 밖에 있음.
- 현재 디렉터리는
PATH에 들어 있지 않다. 그래서 지금 위치에 있는 실행 파일은 ./script.sh처럼 경로를 붙여 실행한다.
which는 PATH에서 실행 파일의 위치를 찾고, type은 그 이름이 내장·별칭·외부 중 무엇인지까지 알려 준다. 내장 명령은 실행 파일이 따로 없을 수 있어 type으로 확인하는 편이 정확하다.
| 표기 | 뜻 |
|---|
/ | 루트 디렉터리. 모든 경로의 시작점 |
. | 현재 디렉터리 |
.. | 한 단계 위(상위) 디렉터리 |
~ | 현재 사용자의 홈 디렉터리 |
- | 직전에 있던 디렉터리 (cd -) |
절대 경로 /home/user/docs/a.txt ← / 로 시작. 어디서 실행하든 같은 곳
상대 경로 docs/a.txt ← 현재 위치 기준
../user2/b.txt ← 위로 한 칸 갔다가 내려감
/로 시작하는가만 보면 절대·상대가 갈린다. 이 한 줄이 시험 포인트다.
| 명령 | 하는 일 |
|---|
man 명령어 | 매뉴얼 페이지. 가장 표준적인 도움말 |
명령어 --help | 간단한 사용법 요약 |
info 명령어 | GNU의 상세 문서 |
whatis 명령어 | 한 줄 설명 |
apropos 키워드 | 키워드로 명령 검색 |
which 명령어 | 실행되는 파일의 경로 |
type 명령어 | 그것이 명령인지 별칭인지 내장인지 |
같은 이름이 명령어이기도 하고 설정 파일이기도 할 때 섹션으로 구분한다.
| 섹션 | 내용 |
|---|
| 1 | 일반 사용자 명령 |
| 5 | 설정 파일 형식 |
| 8 | 시스템 관리자 명령 |
man 1 passwd # passwd 명령
man 5 passwd # /etc/passwd 파일의 형식
man 안에서는 q로 나가고, 화살표·Space로 넘기며, /단어로 검색한다.
- 섹션을 지정하지 않으면 정해진 검색 순서에서 처음 발견된 하나만 나온다. 그래서
man passwd는 명령(1)을 보여 주고, 파일 형식을 보려면 5를 명시해야 한다.
섹션은 원래 아홉 개다. 시험에는 1·5·8이 주로 나오지만 전체 그림을 알아 두면 헷갈리지 않는다.
| 섹션 | 내용 | 섹션 | 내용 |
|---|
| 1 | 일반 사용자 명령 | 6 | 게임 |
| 2 | 시스템 호출 | 7 | 기타(규약·표준 등) |
| 3 | 라이브러리 함수 | 8 | 시스템 관리자 명령 |
| 4 | 특수 파일(장치) | 9 | 커널 루틴 |
| 5 | 설정 파일 형식 | | |
| 항목 | 담긴 것 |
|---|
| NAME | 명령 이름과 한 줄 설명 |
| SYNOPSIS | 사용 형식 — 옵션과 인자를 어떤 순서로 쓰는가 |
| DESCRIPTION | 상세 설명 |
| OPTIONS | 옵션별 설명 |
| FILES | 관련 설정 파일 |
| SEE ALSO | 함께 볼 다른 매뉴얼 |
SYNOPSIS
ls [OPTION]... [FILE]...
[ ] 는 생략할 수 있다는 뜻, ... 는 여러 개를 이어 쓸 수 있다는 뜻이다. 위 한 줄은 "옵션도 파일도 없어도 되고, 여러 개 줘도 된다"로 읽는다.
SEE ALSO에 passwd(5)처럼 적힌 괄호 안 숫자가 바로 섹션 번호다.
| 명령 | 같은 일을 하는 man 옵션 | 찾는 방식 |
|---|
whatis 이름 | man -f 이름 | 이름이 정확히 일치하는 매뉴얼의 한 줄 설명 |
apropos 키워드 | man -k 키워드 | 이름과 설명에 키워드가 들어 있는 매뉴얼 전부 |
whatis passwd
# passwd (1) - update user's authentication tokens
# passwd (5) - password file
apropos "copy files"
# cp (1) - copy files and directories
- 명령 이름을 알면
whatis, 모르고 하려는 일만 알면 apropos 다.
- 내장 명령은
man보다 help cd 처럼 셸의 help로 보는 것이 빠르다.
| 키 | 하는 일 |
|---|
| Tab | 명령·파일명 자동 완성. 두 번 누르면 후보 목록 |
| ↑ / ↓ | 이전에 친 명령 불러오기 |
history | 명령 기록 보기 |
| Ctrl + C | 실행 중인 명령 중단 |
| Ctrl + D | 입력 종료 / 로그아웃 |
| Ctrl + L | 화면 지우기 (clear와 같음) |
Tab 자동완성은 오타를 줄여줄 뿐 아니라 경로가 맞는지 확인하는 수단이기도 하다. 완성이 안 되면 그 경로가 없는 것이다.
셋 다 "멈춘다"처럼 보이지만 결과가 다르다.
| 키 | 실제로 일어나는 일 | 그 뒤 |
|---|
| Ctrl + C | 실행 중인 명령에 중단 신호(SIGINT) 를 보낸다 | 명령이 끝난다 |
| Ctrl + Z | 일시 정지 신호를 보낸다 | 명령이 멈춘 채 남는다. fg로 다시 이어 간다 |
| Ctrl + D | 신호가 아니라 "입력이 끝났다"(EOF) 는 표시 | 입력을 기다리던 명령이 정상 종료한다. 빈 프롬프트에서는 로그아웃 |
$ sleep 100
^Z
[1]+ Stopped sleep 100
$ fg
sleep 100
^C
$
Ctrl + Z로 멈춘 명령은 사라진 것이 아니다. 종료하려던 것이었다면 Ctrl + C를 썼어야 한다.
- 줄을 고칠 때는 Ctrl + A(줄 맨 앞으로) · Ctrl + E(줄 맨 끝으로) · Ctrl + U(커서 앞을 지움)가 편하다.
내일은 이 문법으로 실제 파일과 디렉터리를 다루는 명령들을 익힌다.
- 프롬프트(Prompt) : 셸이 명령을 기다린다는 표시. 사용자·호스트·현재 위치·권한을 보여준다.
- 옵션(Option) : 명령의 동작 방식을 바꾸는 표시.
-a 같은 짧은 형과 --all 같은 긴 형이 있다.
- 인자(Argument) : 명령이 처리할 대상. 파일명이나 디렉터리 이름이 온다.
- 절대 경로 :
/부터 시작하는 전체 경로. 현재 위치와 무관하게 같은 곳을 가리킨다.
- 상대 경로 : 현재 디렉터리를 기준으로 하는 경로.
- 홈 디렉터리 : 사용자에게 할당된 개인 디렉터리.
~로 줄여 쓴다.
- man 페이지 : 명령의 공식 매뉴얼. 섹션 번호로 같은 이름을 구분한다.
- 자동 완성 : Tab 키로 명령·경로의 나머지를 채워 넣는 기능.
- 내장 명령(Builtin) :
cd처럼 셸 안에 들어 있는 명령. type으로 확인하고 help로 도움말을 본다.
- PATH : 셸이 명령의 실행 파일을 찾을 때 뒤지는 디렉터리 목록. 현재 디렉터리는 들어 있지 않다.
📝 연습 문제
선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 셸 프롬프트의 마지막 문자가 #일 때 알 수 있는 것으로 알맞은 것은?
다음 중 ls -l -a 와 같은 의미를 갖는 명령으로 알맞은 것은?
다음 중 절대 경로에 해당하는 것으로 알맞은 것은?
다음 중 /etc/passwd 파일의 형식에 대한 매뉴얼을 보려고 할 때 알맞은 명령은?
다음 중 실행 중인 명령을 강제로 중단할 때 사용하는 키 조합으로 알맞은 것은?