iBetter Books
수정

Bash에서 Python으로의 전환 시점

Bash를 배웠다고 해서 모든 자동화 작업에 Bash를 써야 하는 건 아닙니다. 반대로 Python을 안다고 해서 쉘 스크립트를 버릴 이유도 없습니다. 좋은 개발자는 상황에 맞는 도구를 고릅니다. 이 절에서는 그 판단 기준을 정리합니다.

Bash를 계속 사용해야 할 때

다음 다섯 가지 상황에서는 Bash가 Python보다 자연스러운 선택입니다.

1. 시스템 명령어를 조합하는 파이프라인.

ps aux | grep nginx | awk '{print $2}' | xargs kill 처럼 시스템 명령어를 연결하는 작업은 Bash가 훨씬 간결합니다. Python으로 같은 작업을 하려면 subprocess, Popen, 파이프 연결 코드가 여러 줄 필요합니다. 시스템과 직접 대화하는 작업에서는 Bash가 가장 직관적입니다.

2. 100줄 이하의 간단한 자동화.

백업, 로그 압축, 파일 정리처럼 단순 반복 작업은 Bash로 짧게 작성하는 것이 유지보수에도 유리합니다. Python 파일을 열면 인터프리터 경로, 라이브러리 임포트, 클래스 정의부터 시작해야 하지만 Bash는 바로 명령어를 쓸 수 있습니다.

3. 시스템 초기화 및 부팅 스크립트.

/etc/init.d/ 아래의 서비스 시작 스크립트나 서버 초기화 스크립트는 대부분 Bash로 작성됩니다. Python이 설치되기 전 단계에서 실행되거나, 최소한의 시스템 환경에서 동작해야 하는 경우에는 Bash가 필수입니다.

4. CI/CD 파이프라인 글루 코드.

GitHub Actions, GitLab CI의 run 블록, Dockerfile의 RUN 명령어는 쉘 스크립트로 작성합니다. 빌드 스크립트, 테스트 실행, 배포 명령어 연결처럼 여러 도구를 이어주는 접착제 역할에서 Bash는 여전히 표준입니다.

5. 외부 패키지나 의존성 없이 실행해야 할 때.

Python 스크립트는 실행 환경에 인터프리터와 필요한 패키지가 설치되어 있어야 합니다. Bash 스크립트는 Unix 계열 시스템이라면 추가 설치 없이 바로 실행됩니다. 환경 제어권이 없거나, 패키지 설치가 번거로운 환경에서는 Bash가 현실적인 선택입니다.

Python으로 전환해야 할 때

다음 다섯 가지 신호 중 하나라도 해당된다면 Python을 고려할 시점입니다.

1. 복잡한 데이터 구조가 필요할 때.

딕셔너리, 중첩 리스트, 클래스 인스턴스처럼 복잡한 데이터를 다뤄야 한다면 Python이 훨씬 낫습니다. Bash의 연관 배열(declare -A)은 기본적인 키-값 저장은 되지만, 중첩 구조나 복잡한 조작은 금방 한계에 부딪힙니다.

2. JSON, YAML, XML 파싱이 필요할 때.

Bash에서 jq로 JSON을 다룰 수 있지만, 중첩 구조가 깊어지면 jq 표현식이 매우 복잡해집니다. Python의 json, pyyaml, xml.etree 모듈은 파싱과 생성 모두 자연스럽게 처리할 수 있습니다. API 응답을 파싱하거나 설정 파일을 다루는 작업이 주가 된다면 Python이 적합합니다.

3. HTTP API 호출이 중심일 때.

curl로 API를 호출하고 응답을 파싱하는 작업이 많아지면 Bash 스크립트가 금방 복잡해집니다. Python의 requests 라이브러리는 인증, 세션 관리, 에러 처리를 훨씬 깔끔하게 다룰 수 있습니다. 외부 서비스와 통신하는 스크립트라면 Python을 선택하세요.

4. 에러 처리 로직이 복잡할 때.

Bash의 에러 처리는 $? 체크, ||, &&, trap 조합으로 가능하지만 논리가 복잡해지면 추적하기 어렵습니다. Python의 try-except-finally 블록과 커스텀 예외 클래스는 에러 처리를 명확하게 구조화할 수 있습니다.

5. 비즈니스 로직이 100줄을 넘을 때.

"100줄"은 절대적인 기준이 아니지만, 쉘 스크립트가 길어질수록 유지보수 비용이 급격히 올라갑니다. 테스트 작성, 모듈 분리, 타입 힌트 같은 Python의 강점이 긴 코드에서 빛을 발합니다. 코드가 커질 것이 예상된다면 처음부터 Python으로 시작하는 것이 낫습니다.

Bash와 Python 혼합 패턴

두 언어를 선택하는 것이 아니라 함께 쓰는 방법도 있습니다.

Bash에서 Python 스크립트 호출.

복잡한 데이터 처리는 Python 스크립트에 맡기고, 전체 흐름 제어는 Bash가 담당하는 패턴입니다.

#!/usr/bin/env bash# filename: deploy.shset -euo pipefailecho "환경 변수 검증 중..."python3 validate_config.py --env productionecho "빌드 시작..."./build.shecho "배포 결과 분석..."python3 analyze_deploy.py --log-file deploy.log --notify slack

Python에서 subprocess로 Bash 명령 실행.

반대로 Python 스크립트 안에서 시스템 명령어를 실행해야 할 때는 subprocess 모듈을 사용합니다.

# filename: backup.pyimport subprocessimport sysdef run_command(cmd: list[str]) -> str:    result = subprocess.run(        cmd,        capture_output=True,        text=True,        check=True    )    return result.stdout.strip()def create_backup(source: str, dest: str) -> None:    run_command(["rsync", "-av", "--delete", source, dest])    size = run_command(["du", "-sh", dest])    print(f"백업 완료: {size}")

Bash vs Python 작업별 적합도

작업 유형 Bash Python 추천
파일 복사, 이동, 삭제 매우 적합 가능 Bash
텍스트 파이프라인 매우 적합 가능 Bash
시스템 서비스 제어 적합 가능 Bash
CI/CD 글루 코드 적합 가능 Bash
JSON/YAML 파싱 제한적 매우 적합 Python
HTTP API 호출 가능 매우 적합 Python
복잡한 데이터 처리 어려움 매우 적합 Python
테스트 작성 어려움 매우 적합 Python
단순 자동화 (< 100줄) 적합 적합 Bash
복잡한 자동화 (> 100줄) 가능 매우 적합 Python

두 언어를 모두 잘 다루는 것이 이상적입니다. Bash는 도구이지 종교가 아닙니다. 상황에 따라 최선의 도구를 고르는 판단력이 실력입니다.