
Bash에 대한 기능은 끝났고, 이번 편을 끝으로 리눅스 이해는 마무리할 예정이다.
사실 이번 내용이 Bash 기능보다 더 앞에 나왔어야 하는 게 아닌가 하는 생각이 들지만,
어쨌든 알아두면 좋으니까,, 바로 시작해 보겠다.
패키지
프로그램 실행 파일과 프로그램 동작에 필요한 라이브러리, 설정 파일 등 관련 파일을 묶은 하나의 단위
패키지 관리 시스템
수많은 소프트웨어를 설치/업데이트/삭제하기 편리하도록 사용하는 패키지 전용 프로그램
사용자로부터 명령어를 받아 패키지 설치, 삭제, 검색, 업데이트 등의 작업을 수행
리포지토리(서버)에서 패키지를 다운로드하고 설치
시스템 변경 작업이 일어나기 때문에 보통 sudo 명령어를 사용
패키지를 설치/관리할 수 있는 프로그램
예 : apt (Debian/Ubuntu 계열), yum (CentOS), dnf (Fedora), snap (컨테이너형 패키지)
사용자 → 명령어 입력 → apt (패키지 관리자)
↕
리포지토리(패키지 저장소)
↕
실제 패키지 파일 다운로드 및 설치
패키지 종속성(Dependency)
특정 라이브러리 또는 다른 프로그램에 의존하는 프로그램이 있을 때, 이 특징을 종속성이라 함
패키지 관리 시스템은 종속성 문제를 자동으로 해결하여 필요한 패키지는 함께 설치함
apt(Advanced Package Tool)
데비안과 우분 계열의 리눅스 배포판에 탑재된 패키지 관리 시스템
패키지 DB 업데이트 : sudo apt update(리스트를 업데이트), sudo apt upgrade(업그레이드 가능한 거 다 설치)
패키지 조회 : list, search, show
패키지 설치 : install
패키지 삭제 : remove, autoremove
패키지 데이터베이스 업데이트
sudo apt update
리포지토리에 있는 패키지 목록을 최신 상태로 갱신
설치 가능한 패키지 업그레이드
sudo apt upgrade
설치된 모든 패키지 중 업데이트가 있는 패키지를 자동 설치
개별 패키지 설치
sudo apt install 패키지명
패키지 정보 조회
apt list 패키지명
apt search 키워드
apt show 패키지명
리눅스 프로세스 메모리 공간 구조
사용자 공간(User Space)
일반 애플리케이션, 사용자용 프로세스가 동작하는 메모리 영역
최상위 프로세스는 systemd (PID 1)로, 시스템의 부팅과 서비스 관리 역할
커널 공간(Kernel Space)
OS 커널과 시스템 프로세스가 동작하는 메모리 영역
최상위 프로세스는 [kthreadd] (PID 2)
데몬(Daemon)과 서비스
systemd가 관리하는 대부분의 프로세스는 백그라운드에서 실행되는 서비스
특정 백그라운드 실행 서비스를 데몬이라 하며, 평소에는 ‘S’ (Sleep) 상태로 대기하다가 필요할 때 활성화되어 작업을 수행함
stdin, stdout, stderr이 없고 주로 로그에 상태를 기록
systemctl 유틸리티
systemctl은 systemd 서비스 및 유닛을 관리하는 명령행 도구
| 명령어 | 설명 |
|---|---|
| systemctl list-units | 시스템의 서비스 목록 확인 |
| systemctl status 서비스명 | 특정 서비스 상태 확인 |
| systemctl start 서비스명 | 서비스 시작 |
| systemctl stop 서비스명 | 서비스 중지 |
| systemctl enable 서비스명 | 부팅 시 자동 시작 설정 |
| systemctl disable 서비스명 | 부팅 시 자동 시작 해제 |
| systemctl cat 서비스명 | 서비스 유닛 파일 내용 보기 |
서비스 유닛 파일
서비스 설정, 실행 방법, 의존성 등을 정의한 파일
| 섹션 | 역할 및 설명 |
|---|---|
| [Unit] | 서비스 설명, 실행 순서와 의존성 설정 (After, Wants 등) |
| [Service] | 실제 실행 명령어(ExecStart), 재시작 정책 등 |
| [Install] | 부팅 시 자동 실행 관련 설정 (WantedBy 등) |
서비스 등록 및 관리 과정
스크립트 작성 (실행할 프로그램 또는 서비스 스크립트 준비)
유닛 파일 작성 (/etc/systemd/system/myservice.service 등)
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/my_program --option
Restart=on-failure
[Install]
WantedBy=multi-user.target
서비스 활성화
sudo systemctl enable myservice.service
서비스 시작
sudo systemctl start myservice.service
서비스 상태 확인
sudo systemctl status myservice.service
서비스 중지 및 비활성화
sudo systemctl stop myservice.service
sudo systemctl disable myservice.service
.bashrc 파일
Bash가 시작될 때 읽어들이는 셸 스크립트 파일로, 사용자별 셸 환경을 개인화하는 데 사용
다른 파일 읽어들이기, 환경 변수/셸 변수 설정, alias 설정, Bash 옵션 설정 등의 작업
# .bashrc 수정 후 현재 셸에 즉시 반영
source ~/.bashrc
# 또는
. ~/.bashrc
.profile과의 관계
.profile은 로그인 셸에서 읽히는 초기화 파일로, 내부에서 ~/.bashrc를 불러 실행하는 경우 많음
dash, sh 등의 다른 셸에서는 .bashrc 대신 .profile을 사용하기도 함
.bashrc에 변수/alias 설정하기
.bashrc 파일을 직접 편집 가능
alias의 경우 .bashrc_aliases에 작성해도 됨
# ~/.bashrc 변수 설정 예시
export EDITOR="nano"
export PROJECT_HOME="$HOME/projects"
export PATH="$PROJECT_HOME/bin:$PATH"
# alias 설정 예
alias ll='ls -alF'
alias la='ls -A'
alias gst='git status'
alias venv='source venv/bin/activate'
grep(Global regular expression print)
표준 입력이나 텍스트 파일에서 특정 패턴이나 문자열을 찾는 커맨드라인 툴
grep [옵션] 검색_패턴 [파일명] 형태로 사용하고, 표준 입력이나 텍스트 파일 대상으로 검색 가능
주요 옵션
| 옵션 | 설명 |
|---|---|
| -r | 하위 디렉토리 내 파일 재귀 검색 |
| -i | 대소문자 구분 없이 검색 |
| -v | 패턴과 일치하지 않는 행 출력 |
| -n | 해당 행의 라인 번호 함께 출력 |
| -c | 일치하는 행의 개수만 출력 |
| -l | 패턴이 포함된 파일명만 출력 |
| -L | 패턴이 없는 파일명만 출력 |
| -E | 확장 정규 표현식(extended regex) 사용 |
| -o | 패턴과 일치하는 부분만 별도로 출력 |
| -A [숫자] | 일치 행 이후 추가 출력 행 수 지정 |
정규 표현식(Regular Expression)
특정한 규칙의 문자열 패턴을 찾거나 추출, 치환하는 데 사용하는 특수한 문자열
여러 기호를 사용해 유연한 문자열을 만들 수 있음
아래 분류 외에도 그룹화와 캡처, 대안, 전방/후방 탐색, 자 부정 클래스, 메타문자 등이 있음
리터럴(Literal)
문자를 직접 매칭
cat → 정확히 "cat" 문자열만 일치
문자 클래스(Character Classes)
[ ] 사이의 문자와 하나라도 일치하는지 확인
[abc] → a, b, 또는 c 중 하나와 일치
[0-9] → 0~9 사이의 숫자와 일치
[A-Za-z] → 알파벳 대소문자라면 일치
축약 문자 클래스(Shorthand Classes)
| 패턴 | 의미 |
|---|---|
| \d | 숫자 (0-9) |
| \w | 알파벳, 숫자, 밑줄 (단어 문자) |
| \s | 공백 문자 (스페이스, 탭 등) |
수량자 (Quantifiers)
문자가 몇 번 반복되는지 지정
| 수량자 | 의미 |
|---|---|
| * | 0번 이상 반복 |
| + | 1번 이상 반복 |
| ? | 0번 또는 1번 |
| {n} | 정확히 n번 반복 |
| {n,} | n번 이상 반복 |
| {n,m} | n번 이상 m번 이하 반복 |
앵커(Anchors)
문자 자체가 아닌 문자의 위치를 지정
| 패턴 | 의미 |
|---|---|
| ^ | 문자열의 시작 (line start) |
| $ | 문자열의 끝 (line end) |
사용 예시
# 줄 시작이 "One"이고, 줄 끝이 "master."인 패턴 찾기
grep "^One.*master.$" file.txt
# 숫자가 포함된 단어 검색
grep "\d+" file.txt
# 특정 패턴이 한 번 이상 있는 줄 검색
grep "error+" log.txt
# 공백 문자가 있는 줄 찾기
grep "\s" file.txt
find
파일이나 디렉토리 자체를 조건에 맞게 검색하는 커맨드라인 툴 (grep은 파일 내용 검색)
find [옵션] [검색경로] [표현식]
주요 옵션
| 옵션 | 설명 |
|---|---|
| -L | 심볼릭 링크의 원본 파일까지 추적 |
| -P | 심볼릭 링크 자체에 대해 작업 (기본값) |
주요 표현식
| 표현식 | 설명 |
|---|---|
-name [패턴] | 파일명 패턴으로 검색 (예: *.sh) |
-type [유형] | 타입 별 검색 (f 파일, d 디렉토리 등) |
-exec [명령] {} \; | 검색 결과를 명령에 넘겨 실행 (xargs로 대체 가능) |
-printf [형식_한정자] | 출력 형식 지정 |
-size [n][c/k/M/G] | 파일 크기 기준 검색 (byte, KB, MB, GB) |
-user [사용자명] | 해당 사용자가 소유한 파일 검색 |
-group [그룹명] | 해당 그룹이 소유한 파일 검색 |
-maxdepth [숫자] | 검색할 디렉터리 최대 깊이 제한 |
-mindepth [숫자] | 검색 시작 최소 깊이 지정 |
사용 예시
# 하루 이내에 수정된 .log 파일 찾기
find /var/log -name "*.log" -mtime -1
# 크기가 10MB 이상인 파일 찾기
find /data -size +10M
# 특정 사용자 소유 파일 찾기
find /home -user alice
# 권한 755를 가진 파일 찾기
find . -perm 755
# 빈 디렉토리 찾기
find . -type d -empty
# 여러 파일 한 번에 명령 실행
find . -name "*.txt" -exec wc -l {} \;
# xargs 사용, 공백 포함을 대비한 파일명 전달
find . -name "*.sh" -print0 | xargs -0 wc -l
stat
파일이나 디렉토리의 상세한 정보를 표시하는 커맨드라인 툴
파일 크기, 디스크 블록 수, inode 번호, 하드 링크 수, 접근/수정/변경 시각 등 자세한 메타데이터 확인 가능
주요 옵션
| 옵션 | 설명 |
|---|---|
| -c, --format=FORMAT | 출력 형식 지정 (%s크기,%A권한 등) |
| -f, --file-system | 파일시스템 정보출력 |
| -L, --dereference | 심볼릭 링크의 실제 파일 정보 출력 |
| -t | 축약 형식출력 |
| --printf=FORMAT | printf 스타일 형식 지정 |
출력 형식 지정자
| 지정자 | 출력 |
|---|---|
| %n | 파일명 |
| %s | 크기 (바이트) |
| %A | 인간가독 권한 (-rw-r--r--) |
| %a | 8진수 권한 (644) |
| %U | 사용자명 |
| %G | 그룹명 |
| %y | 수정시간 |
| %Y | 수정시간 (유닉스 타임스탬프) |
| %i | inode 번호 |
사용 예시
stat file.txt
# File: file.txt
# Size: 1234 Blocks: 8 IO Block: 4096 regular file
# ...
stat -c "%n %s %A %y" file.txt
# file.txt 1234 -rw-r--r-- 2025-12-02 11:00:00.000000000 +0900
# 파일 크기와 권한만 확인
stat -c "%n %s bytes (%A)" *.txt
# 최근 수정된 파일 찾기
find . -name "*.log" -exec stat -c "%Y %n" {} \; | sort -nr | head
# inode 중복 파일 찾기
find /data -type f -printf "%i %p\n" | sort | uniq -d | cut -d' ' -f2-
wc
파일이나 표준 입력의 줄, 단어, 문자, 바이트 수를 세는 명령어
주요 옵션
| 옵션 | 설명 |
|---|---|
| -l | 줄(line) 수 |
| -w | 단어(word) 수 |
| -c | 바이트(byte) 수 |
| -m | 문자(character) 수 |
| -L | 가장 긴 줄의 문자 개수 |
사용 예시
wc file.txt # 기본 (줄, 단어, 바이트 수 출력)
wc -l file.txt # 줄 수만 출력
echo "hello world" | wc -w # 단어 개수 세기
wc -c *.txt # 여러 파일의 바이트 수 출력
df
디스크 파일시스템의 전체/사용/여유 용량을 표시하는 명령어
주요 옵션
| 옵션 | 설명 |
|---|---|
| -h | 사람이 읽기 쉬운 단위로 표시 (KB, MB, GB) |
| -T | 파일시스템 타입 표시 |
| -a | 모든 파일시스템 표시 |
사용 예시
df -h # 디스크 용량을 GB/MB 단위로 출력
df -T /home # /home의 파일시스템 종류와 용량 확인
df # 전체 파일시스템 사용량
du
디렉터리(폴더)와 파일의 디스크 사용량을 계산해서 표시하는 명령어
주요 옵션
| 옵션 | 설명 |
|---|---|
| -h | 사람이 읽기 쉬운 단위(K, M, G)로 표시 |
| -s | 총합만 요약해서 표시 |
| -a | 파일별 사용량 모두 표시 |
| -d n | n레벨까지 하위 디렉터리 표시 |
사용 예시
du -h # 디렉터리별 사용량
du -sh * # 현재 폴더 내 각 항목 총용량
du -h --max-depth=1 # 1단계 하위 디렉터리까지 표시
tar
여러 파일과 디렉토리를 하나의 아카이브 파일로 압축하거나, 압축한 파일을 푸는 커맨드라인 툴
테이프 저장용 아카이브로 개발되었으나 현재는 다양한 압축 도구와 결합하여 널리 사용
tar [옵션] [-f 아카이브_파일명] [대상 파일/디렉터리]
아카이브 : 여러 파일과 디렉토리를 한 덩어리로 만드는 것
주요 옵션
| 옵션 | 설명 |
|---|---|
| -c | 새로운 아카이브 생성 (create) |
| -x | 아카이브에서 파일 추출 (extract) |
| -t | 아카이브 내 파일 목록 확인 (list) |
| -f | 사용할 아카이브 파일명 지정 (file) |
| -v | 실행 과정을 자세히 출력 (verbose) |
| -z | gzip 압축 적용/해제 |
| -j | bzip2 압축 적용/해제 |
| -J | xz 압축 적용/해제 |
| -C | 아카이브를 풀 대상 디렉터리 지정 |
| -r | 기존 아카이브에 파일을 덧붙임 (append) |
read
표준 입력에서 한 줄을 읽어 변수에 저장하는 Bash의 내장 명령어
read [옵션] [변수명] 형태로 사용하며, 변수를 지정하지 않으면 REPLY 변수에 자동 저장
주요 옵션
| 옵션 | 설명 |
|---|---|
| -p ["프롬프트"] | 프롬프트 메시지 출력 후 입력 대기 |
| -r | 백슬래시()를 이스케이프 문자로 해석하지 않음 |
| -s | 입력 시 화면 출력 안 함 (비밀번호용) |
| -t [초] | 최대 대기 시간 (초 단위) |
| -n [숫자] | 지정된 문자 수만큼만 읽기 |
| -d [구분자] | 개행(\n) 대신 지정 구분자까지 읽기 |
| -a [배열] | 입력을 배열로 저장 |
사용 예시
# 기본 (프롬프트와 함께 입력 받기)
read -p "이름을 입력하세요: " name
echo "안녕하세요, $name님!"
# 파이프라인 활용
echo "John 25" | read -r name age
echo "이름: $name, 나이: $age"
# 배열 활용
echo "1 2 3 4" | read -a numbers
echo "${numbers[@]}"
tr
표준 입력에서 문자를 바꾸거나(translate), 삭제(delete)하는 필터 명령어
주요 옵션
| 옵션 | 설명 |
|---|---|
| -d | 지정한 문자 삭제 |
| -s | 지정 문자를 연속된 한 문자로 압축 |
| -c | 문자 집합 반전(제외 집합 지정) |
사용 예시
echo "HELLO" | tr 'A-Z' 'a-z' # 소문자로 변환
echo "hello world" | tr -s ' ' # 연속 공백을 1개로
echo "apple" | tr -d 'aeiou' # 모음 삭제
여기까지가 리눅스 기본 내용이었고
다음 편부터는 리눅스 개발환경의 도구에 대한 글을 쓸 예정이다!
매우매우 길었던 리눅스 이해 이제 끄읕