Shell 핵심 개념 정리

Shell과 Kernel, Shell 종류 비교, WSL 동작 원리, 스크립트 구조, 초기화 개념

Shell과 관련된 기본 개념을 실용적인 예시와 함께 간결하게 정리한다. Shell과 Kernel 차이, Bash/Zsh/Fish 비교, WSL에서의 동작 방식, Shell script 기본 구조, Conda/Poetry/Git의 ‘초기화’ 개념을 각각 10줄 내외로 설명한다.

Engineering
Infra
Shell
OS
저자

Kwangmin Kim

공개

2023년 12월 05일

1 Shell과 Kernel 차이

Shell (사용자 인터페이스)
- 역할: 사용자와 운영체제(Kernel) 사이의 다리 역할
- 동작: 사용자의 명령을 해석하고 Kernel이 이해할 수 있는 시스템 호출 또는 프로그램 실행 요청으로 변환
- 위치: 사용자 공간(user-space)에서 동작
- 특징: 편리한 문법(파이프, 리다이렉션, 변수 등) 제공으로 사용자 생산성 향상

Kernel (운영체제 핵심)
- 역할: 운영체제의 심장, 하드웨어 자원(CPU, 메모리, 디스크 등) 직접 관리 및 요청 수행
- 동작: Shell로부터 받은 요청을 처리하여 하드웨어 제어
- 위치: 커널 공간(kernel-space)에서 최고 권한으로 동작
- 중요성: Shell에서 하드웨어를 직접 조작하지 못하고 Kernel을 통해서만 제어하도록 권한 분리하여 시스템 안정성 및 보안 확보

2 Bash vs Zsh vs Fish

Bash (Bourne-Again SHell)
- 특징: 범용적, 안정적, 스크립트 호환성 매우 높음. 거의 모든 리눅스/유닉스 시스템의 기본 Shell
- 주요 사용: 서버 환경, CI/CD 자동화 스크립트
- 쉐뱅: #!/bin/bash 또는 #!/usr/bin/env bash 사용

Zsh (Z SHell)
- 특징: Bash 기능 포함 + 강력한 인터랙티브 기능, 뛰어난 커스터마이징 (Oh My Zsh)
- 주요 기능: 강력한 자동완성, 문법 강조, 히스토리 검색, 디렉토리 자동 전환
- 주요 사용: 개발자 데스크탑 (macOS 기본 Shell), 생산성 중시 사용자

Fish (Friendly Interactive SHell)
- 특징: 사용자 친화적, 기본 설정으로 직관적인 자동완성/문법 강조/테마 제공
- 스크립트 호환성: Bash/Zsh와 문법 차이가 있어 스크립트 호환성 문제 발생 가능 (예: VAR=1 대신 set VAR 1)
- 주요 사용: Shell 초보자, 간편하고 직관적인 사용 선호 사용자

결론
- 서버/배치성 스크립트: Bash (호환성, 안정성)
- 일상 작업/개발 환경: Zsh 또는 Fish (편의성, 생산성)

3 WSL에서 Shell 동작 방식

  • WSL (Windows Subsystem for Linux): Windows에서 리눅스 바이너리 실행을 위한 호환 계층
  • WSL1: 리눅스 시스템 호출을 Windows 시스템 호출로 실시간 변환 (Translation Layer)
  • WSL2 (주력): 실제 리눅스 Kernel을 경량 가상 머신(Lightweight VM)으로 Windows 위에서 실행
    • 사용자가 리눅스 Shell (Bash/Zsh) 실행 시, WSL2 내 리눅스 Kernel과 직접 상호작용
  • 파일 시스템 접근
    • 리눅스 파일 시스템 (/home/user/) 직접 접근 가능
    • Windows 파일 시스템 (/mnt/c 등) 마운트 포인트를 통해 접근 가능 (WSL2는 9P 프로토콜로 효율화)
  • 네트워크 통합: Windows 스택과 통합, Windows에서 WSL 서비스에 접근 가능
  • 장점: apt 등 일반 리눅스 도구 사용, 일관된 개발 환경 구성 가능
  • 주의: WSL과 Windows 간 I/O 성능 차이 (특히 9P 프로토콜 경유 시). 성능 중요한 작업은 WSL 내 리눅스 파일 시스템(~/)에서 수행 권장

4 Shell Script의 기본 구조

1. 해더 (Shebang): #!/usr/bin/env bash
- 스크립트 실행 해석기 지정. env를 통해 PATH에서 bash를 찾아 실행, 이식성 높임

2. 초기 설정 (Option Setting): 스크립트 견고성 향상
- set -e: 에러 발생 시 스크립트 즉시 중단
- set -u 또는 set -o nounset: 정의되지 않은 변수 참조 시 에러 발생
- set -o pipefail: 파이프라인에서 하나라도 실패 시 전체 실패 처리

3. 변수 선언 및 환경 설정: 스크립트에서 사용될 변수 정의

4. 함수 정의: 코드 모듈화 및 재사용성 증대

5. 입력 파라미터 처리: 스크립트 실행 시 전달되는 값 처리
- $1, $2, $@ (모든 파라미터), $# (파라미터 개수), $0 (스크립트 이름)
- 예: name=${1:-World} (파라미터 없으면 기본값 ‘World’)

6. 메인 실행 블록: 정의된 함수와 변수를 활용하여 핵심 로직 수행

이식성: POSIX 호환 스크립트로 작성하면 sh에서도 동작하여 이식성 향상

5 Conda/Poetry/Git이 왜 “초기화” 개념을 사용하는지

6 Conda/Poetry/Git이 왜 “초기화” 개념을 사용하는지

초기화(init)의 목적: 환경을 재현 가능하게 만들기 위한 설정 단계

Conda의 conda init
- Shell 시작 시 Conda 경로와 활성화 함수가 자동 로드되도록 설정 (.bashrc, .zshrc 등에 스크립트 추가)
- 가상환경 관리가 쉬워지고, conda activate 명령을 사용 가능하게 함

Poetry의 poetry init
- 프로젝트의 의존성 메타데이터(pyproject.toml) 생성
- 특정 패키지 버전 집합으로 프로젝트를 고정하여 재현 가능한 환경 구축

Git의 git init
- 디렉토리에 .git 메타데이터 폴더 생성
- 버전관리 트래킹 시작 (커밋, 브랜치, 히스토리 관리 가능)

공통점: ‘프로젝트/환경을 사용 가능하게 만들기 위해 메타데이터와 설정을 심는 작업’

초기화 후에는 동일한 명령어로 재현 가능한 작업(환경 활성화, 의존성 설치, 버전 관리)이 가능해 협업과 배포가 쉬워진다.

Subscribe

Enjoy this blog? Get notified of new posts by email: