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과 직접 상호작용
- 사용자가 리눅스 Shell (Bash/Zsh) 실행 시, WSL2 내 리눅스 Kernel과 직접 상호작용
- 파일 시스템 접근
- 리눅스 파일 시스템 (
/home/user/) 직접 접근 가능
- 리눅스 파일 시스템 (
- Windows 파일 시스템 (
/mnt/c등) 마운트 포인트를 통해 접근 가능 (WSL2는9P 프로토콜로 효율화)
- Windows 파일 시스템 (
- 네트워크 통합: 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 메타데이터 폴더 생성
- 버전관리 트래킹 시작 (커밋, 브랜치, 히스토리 관리 가능)
공통점: ‘프로젝트/환경을 사용 가능하게 만들기 위해 메타데이터와 설정을 심는 작업’
초기화 후에는 동일한 명령어로 재현 가능한 작업(환경 활성화, 의존성 설치, 버전 관리)이 가능해 협업과 배포가 쉬워진다.