2025-09-18 21:25

Tags: 소프트웨어 공학

터미널

  • 그래픽 인터페이스(GUI)가 등장하기 전, 텍스트 명령어(Command-Line Interface, CLI)로 컴퓨터와 소통하기 위해 만들어진 핵심 도구

  • 터미널은 셸(명령어 해석기)이 작동하는 창이며, 사용자의 명령어를 커널(운영체제 핵심)에 전달하는 다리 역할

  • 파일 시스템 탐색, 프로그램 실행, 서버 관리 등 GUI보다 훨씬 효율적이고 강력한 작업이 가능하여 개발자에게 필수적

  • 커널 (Kernel):

    • 자동차의 ‘엔진’입니다. 실제 자동차를 움직이게 하는 핵심 부품이죠.
    • 운영체제의 핵심으로, 하드웨어 제어, 프로세스 관리 등 모든 실제 작업을 처리합니다.
    • 셸 (Shell):
      • 자동차의 ‘운전대, 페달, 기어’입니다.
      • 운전자가 엔진을 제어하기 위해 사용하는 인터페이스입니다.
      • 사용자가 입력한 명령어를 해석해서 커널에 전달하는 역할을 하는 ‘명령어 해석기’입니다.
  • 터미널 (Terminal):

    • 자동차의 ‘운전석’입니다. 운전자가 운전대와 페달을 조작하는 공간 전체를 의미합니다.
    • 셸이 실행되는 환경, 즉 사용자가 명령어를 입력하고 결과를 보는 창 그 자체입니다.
  • 터미널이라는 창을 열고,

  • 그 안에서 BashZsh 같은 에게 명령을 내리면,

  • 셸이 그 명령을 해석해서 운영체제의 핵심인 커널에게 전달하여 실제 작업이 이루어지는 것

프롬프트(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(숨김 파일 포함) 옵션을 사용하여 ~(홈 디렉토리) 라는 인자를 대상으로 실행하라.”

파일 및 디렉토리 관리

명령어설명사용 예시
pwdPrint Working Directory. 현재 작업 중인 디렉토리의 전체 경로를 출력합니다.pwd
lsList. 현재 디렉토리의 파일 및 디렉토리 목록을 보여줍니다.ls, ls -l (자세히), ls -a (숨김 파일 포함)
cdChange Directory. 다른 디렉토리로 이동합니다.cd /home, cd documents, cd .. (상위 디렉토리), cd ~ (홈 디렉토리)
mkdirMake Directory. 새로운 디렉토리(폴더)를 생성합니다.mkdir new_project
rmdirRemove Directory. 비어있는 디렉토리를 삭제합니다.rmdir old_project
cpCopy. 파일이나 디렉토리를 복사합니다.cp source.txt destination.txt, cp -r source_dir/ dest_dir/
mvMove. 파일이나 디렉토리를 이동하거나 이름을 변경합니다.mv old_name.txt new_name.txt, mv file.txt ./target_dir/
rmRemove. 파일이나 디렉토리를 삭제합니다. (주의! 휴지통 없이 바로 삭제됩니다)rm file.txt, rm -r directory/ (디렉토리와 내용 모두 삭제)
touch파일의 수정 시간을 현재 시간으로 변경하거나, 파일이 없으면 빈 파일을 생성합니다.touch new_file.txt

파일 내용 확인

명령어설명사용 예시
catConcatenate. 파일 내용을 화면에 모두 출력합니다. 짧은 파일에 유용합니다.cat config.txt
lesscat과 달리 긴 파일의 내용을 페이지 단위로 보여줍니다. (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 도구들은 모두 터미널 환경에서 가장 효율적으로 작동합니다.
  • 자동화: 셸 스크립트를 통해 빌드, 테스트, 배포 등 개발의 모든 과정을 자동화하여 생산성을 극대화할 수 있습니다.