2025-09-18 21:25
Tags: 소프트웨어 공학
터미널
-
그래픽 인터페이스(GUI)가 등장하기 전, 텍스트 명령어(Command-Line Interface, CLI)로 컴퓨터와 소통하기 위해 만들어진 핵심 도구
-
터미널은 셸(명령어 해석기)이 작동하는 창이며, 사용자의 명령어를 커널(운영체제 핵심)에 전달하는 다리 역할
-
파일 시스템 탐색, 프로그램 실행, 서버 관리 등 GUI보다 훨씬 효율적이고 강력한 작업이 가능하여 개발자에게 필수적
-
커널 (Kernel):
- 자동차의 ‘엔진’입니다. 실제 자동차를 움직이게 하는 핵심 부품이죠.
- 운영체제의 핵심으로, 하드웨어 제어, 프로세스 관리 등 모든 실제 작업을 처리합니다.
- 셸 (Shell):
- 자동차의 ‘운전대, 페달, 기어’입니다.
- 운전자가 엔진을 제어하기 위해 사용하는 인터페이스입니다.
- 사용자가 입력한 명령어를 해석해서 커널에 전달하는 역할을 하는 ‘명령어 해석기’입니다.
-
터미널 (Terminal):
- 자동차의 ‘운전석’입니다. 운전자가 운전대와 페달을 조작하는 공간 전체를 의미합니다.
- 셸이 실행되는 환경, 즉 사용자가 명령어를 입력하고 결과를 보는 창 그 자체입니다.
-
터미널이라는 창을 열고,
-
그 안에서
Bash
나Zsh
같은 셸에게 명령을 내리면, -
셸이 그 명령을 해석해서 운영체제의 핵심인 커널에게 전달하여 실제 작업이 이루어지는 것
프롬프트(Prompt) 이해하기
username@hostname:~/current_directory$
username
: 현재 로그인한 사용자 이름hostname
: 현재 사용 중인 컴퓨터의 이름(네트워크상의 이름)~/current_directory
: 현재 작업 중인 디렉토리 위치 (~
는 홈 디렉토리를 의미하는 약어)$
: 현재 사용자가 일반 사용자임을 나타내는 기호 (만약 루트(root) 사용자라면#
으로 표시됨)- “누가, 어느 컴퓨터의, 어느 위치에서, 어떤 권한으로” 명령을 내릴 준비가 되었는지 알 수 있습니다.
명령어의 기본 구조
명령어 [옵션] [인자]
- 명령어 (Command):
- 실행하고자 하는 프로그램의 이름입니다. (예:
ls
,cd
,mkdir
)
- 실행하고자 하는 프로그램의 이름입니다. (예:
- 옵션 (Option):
- 명령어의 동작 방식을 세부적으로 지정합니다.
- 보통 하이픈(
-
)으로 시작하며, 여러 개를 조합할 수 있습니다. (예:ls -l -a
또는ls -la
)
- 인자 (Argument):
- 명령어가 작업을 수행할 대상을 지정합니다.
- 주로 파일명이나 디렉토리 경로가 해당됩니다. (예:
ls /home/user/documents
) 예를 들어,ls -la ~
라는 명령어는 다음과 같이 해석할 수 있습니다.
“ls 라는 명령어를 -l(자세히 보기)과 -a(숨김 파일 포함) 옵션을 사용하여 ~(홈 디렉토리) 라는 인자를 대상으로 실행하라.”
파일 및 디렉토리 관리
명령어 | 설명 | 사용 예시 |
---|---|---|
pwd | Print Working Directory. 현재 작업 중인 디렉토리의 전체 경로를 출력합니다. | pwd |
ls | List. 현재 디렉토리의 파일 및 디렉토리 목록을 보여줍니다. | ls , ls -l (자세히), ls -a (숨김 파일 포함) |
cd | Change Directory. 다른 디렉토리로 이동합니다. | cd /home , cd documents , cd .. (상위 디렉토리), cd ~ (홈 디렉토리) |
mkdir | Make Directory. 새로운 디렉토리(폴더)를 생성합니다. | mkdir new_project |
rmdir | Remove Directory. 비어있는 디렉토리를 삭제합니다. | rmdir old_project |
cp | Copy. 파일이나 디렉토리를 복사합니다. | cp source.txt destination.txt , cp -r source_dir/ dest_dir/ |
mv | Move. 파일이나 디렉토리를 이동하거나 이름을 변경합니다. | mv old_name.txt new_name.txt , mv file.txt ./target_dir/ |
rm | Remove. 파일이나 디렉토리를 삭제합니다. (주의! 휴지통 없이 바로 삭제됩니다) | rm file.txt , rm -r directory/ (디렉토리와 내용 모두 삭제) |
touch | 파일의 수정 시간을 현재 시간으로 변경하거나, 파일이 없으면 빈 파일을 생성합니다. | touch new_file.txt |
파일 내용 확인
명령어 | 설명 | 사용 예시 |
---|---|---|
cat | Concatenate. 파일 내용을 화면에 모두 출력합니다. 짧은 파일에 유용합니다. | cat config.txt |
less | cat 과 달리 긴 파일의 내용을 페이지 단위로 보여줍니다. (q로 종료) | less long_log_file.log |
head | 파일의 앞부분 10줄만 보여줍니다. | head file.txt , head -n 20 file.txt (20줄) |
tail | 파일의 뒷부분 10줄만 보여줍니다. 실시간 로그 추적에 유용합니다. | tail file.txt , tail -f app.log (파일 변경 실시간 추적) |
강력한 도구: 파이프와 리다이렉션
터미널이 강력한 이유 중 하나는 명령어들을 서로 연결할 수 있기 때문입니다.
- 파이프 (
|
): 한 명령어의 출력 결과를 다른 명령어의 입력으로 전달합니다. 여러 명령어를 체인처럼 연결하여 복잡한 작업을 수행할 수 있습니다.- 예시:
ls -l | less
- 해석:
ls -l
명령어의 결과(파일 목록)가 너무 길어서 화면에 다 안 보일 때, 그 결과를less
명령어의 입력으로 넘겨서 페이지 단위로 편하게 볼 수 있습니다.
- 예시:
- 리다이렉션 (
>
,>>
): 명령어의 출력 결과를 화면 대신 파일에 저장합니다.>
: 파일이 존재하면 덮어쓰고, 없으면 새로 생성하여 저장합니다.- 예시:
ls -l > file_list.txt
- 해석:
ls -l
명령어의 결과를 화면에 출력하는 대신file_list.txt
라는 파일에 저장합니다.
- 예시:
>>
: 파일이 존재하면 맨 뒤에 내용을 추가하고, 없으면 새로 생성하여 저장합니다.- 예시:
echo "New log entry" >> app.log
- 해석: “New log entry” 라는 텍스트를
app.log
파일의 끝에 추가합니다.
- 예시:
셸 스크립트로 작업 자동화
반복적으로 수행해야 하는 명령어들의 순서가 있다면, 이를 하나의 파일로 만들어 한 번에 실행할 수 있습니다. 이것이 바로 셸 스크립트입니다.
간단한 예시 (backup.sh
):
#!/bin/bash
# 이 스크립트는 중요한 파일을 백업 디렉토리에 복사합니다.
echo "백업을 시작합니다..."
cp -r /path/to/important_data ~/backup_directory/
echo "백업이 완료되었습니다."
위 내용을 backup.sh
파일로 저장한 뒤, bash backup.sh
명령어로 실행하면 스크립트 안의 명령어들이 순서대로 실행됩니다. 복잡한 배포 프로세스나 데이터 처리 작업을 자동화하는 데 매우 유용합니다.
환경 변수(Environment Variables)
셸 환경에서 미리 정의되어 어디서든 사용할 수 있는 변수입니다. 시스템의 중요한 설정값들을 담고 있으며, $
기호를 붙여 사용합니다.
$HOME
: 현재 사용자의 홈 디렉토리 경로$PATH
: 셸이 명령어(프로그램)를 찾을 때 참조하는 디렉토리 경로 목록$USER
: 현재 사용자 이름
echo $HOME
명령어로 변수값을 확인할 수 있고, export MY_VAR="hello"
와 같이 새로운 환경 변수를 설정할 수 있습니다.
alias: 나만의 단축 명령어 만들기
길고 복잡한 명령어를 짧은 별명(alias)으로 만들어두고 편하게 사용할 수 있습니다.
# 매번 ls -la 를 입력하기 귀찮을 때
alias ll="ls -la"
# Git 상태를 확인하는 단축 명령어
alias gs="git status"
이렇게 설정해두면, 터미널에 ll
이라고만 입력해도 실제로는 ls -la
명령어가 실행됩니다. 이러한 설정은 보통 ~/.bashrc
또는 ~/.zshrc
같은 셸 설정 파일에 저장하여 터미널을 새로 열 때마다 자동으로 적용되게 합니다.
- 서버 환경: 대부분의 서버는 그래픽 환경(GUI) 없이 오직 터미널로만 접속하고 관리합니다.
- 개발 도구: Git, Docker, 각종 프레임워크의 CLI 도구들은 모두 터미널 환경에서 가장 효율적으로 작동합니다.
- 자동화: 셸 스크립트를 통해 빌드, 테스트, 배포 등 개발의 모든 과정을 자동화하여 생산성을 극대화할 수 있습니다.