효율성을 위한 재사용 가능한 Bash 스크립트 템플릿 만들기

엄격 모드, 사용법 텍스트, 로깅, 정리, 안전한 getopts 인수 파싱을 포함한 재사용 가능한 Bash 스크립트 템플릿을 구축하세요.

효율성을 위한 재사용 가능한 Bash 스크립트 템플릿 만들기

재사용 가능한 Bash 스크립트 템플릿은 작업을 자동화할 때마다 동일한 안전 점검을 다시 작성하지 않도록 도와줍니다. 좋은 템플릿은 프로젝트별 로직을 추가하기 전에 스크립트에 엄격한 오류 처리, 예측 가능한 로깅, 사용법 도움말, 인수 파싱 및 정리 훅을 제공합니다.

목표는 거대한 프레임워크가 아닙니다. 일상적인 스크립트를 일관되게 유지하고 디버깅을 더 쉽게 만드는 작은 시작점입니다.

스크립트 템플릿을 사용하는 이유는?

템플릿은 팀이 백업, 배포, 보고서, 로그 정리 또는 데이터 이동을 위한 많은 작은 스크립트를 작성할 때 유용합니다. 템플릿이 없으면 각 스크립트는 오류, 옵션 및 로깅을 약간씩 다르게 처리하는 경향이 있습니다.

재사용 가능한 템플릿은 다음을 제공합니다:

  • 일관된 엄격 모드 및 인용 습관.
  • 표준 usage 함수.
  • 로깅 도우미를 위한 한 곳.
  • 임시 파일 및 잠금을 위한 정리 훅.
  • getopts를 사용한 예측 가능한 명령줄 파싱.

핵심 템플릿 구성 요소

Bash 자체로 시작한 다음 엄격한 동작을 활성화합니다:

#!/usr/bin/env bash
set -euo pipefail

set -e는 처리되지 않은 많은 명령 실패 시 종료하고, set -u는 설정되지 않은 변수를 오류로 처리하며, set -o pipefail은 파이프라인 내부의 실패를 포착합니다. 예상되는 실패에 대해서는 여전히 명시적인 점검이 필요하지만, 엄격 모드는 많은 우발적인 실수를 포착합니다.

스크립트 이름과 짧은 사용법 블록을 추가합니다:

readonly SCRIPT_NAME="$(basename "$0")"

usage() {
    cat <<USAGE
사용법: $SCRIPT_NAME [-v] [-o output_dir] input_file

옵션:
  -v              상세 로깅 활성화
  -o output_dir   이 디렉토리에 출력 작성
  -h              이 도움말 메시지 표시
USAGE
}

흩어진 echo 호출 대신 작은 로깅 도우미를 사용합니다:

log_info() {
    [[ "$VERBOSE" -eq 1 ]] && printf '[INFO] %s\n' "$1"
}

die() {
    printf '[ERROR] %s\n' "$1" >&2
    exit 1
}

스크립트가 임시 파일이나 잠금 파일을 생성하는 경우, 초기에 정리 함수를 추가합니다:

cleanup() {
    # 여기서 임시 파일을 제거하거나 잠금을 해제합니다.
    :
}

trap cleanup EXIT

getopts를 사용한 안전한 인수 파싱

대부분의 재사용 가능한 템플릿에는 플래그가 필요합니다. Bash의 내장 getopts-v-o output_dir과 같은 짧은 옵션에 충분합니다.

VERBOSE=0
OUTPUT_DIR="."

while getopts ":vo:h" opt; do
    case "$opt" in
        v) VERBOSE=1 ;;
        o) OUTPUT_DIR=$OPTARG ;;
        h) usage; exit 0 ;;
        :) die "옵션 -$OPTARG는 인수가 필요합니다" ;;
        \?) die "알 수 없는 옵션: -$OPTARG" ;;
    esac
done
shift "$((OPTIND - 1))"

INPUT_FILE=${1:-}
[[ -n "$INPUT_FILE" ]] || { usage >&2; exit 1; }
[[ -f "$INPUT_FILE" ]] || die "입력 파일을 찾을 수 없음: $INPUT_FILE"

":vo:h"의 선행 :은 스크립트가 누락된 옵션 인수를 직접 처리할 수 있게 합니다. 파싱 후 shift "$((OPTIND - 1))"는 파싱된 옵션을 제거하여 위치 인수를 더 쉽게 읽을 수 있게 합니다.

재사용할 수 있는 간결한 템플릿

다음은 소규모 운영 스크립트를 위한 실용적인 시작점입니다:

#!/usr/bin/env bash
set -euo pipefail

readonly SCRIPT_NAME="$(basename "$0")"
VERBOSE=0
OUTPUT_DIR="."

usage() {
    cat <<USAGE
사용법: $SCRIPT_NAME [-v] [-o output_dir] input_file
USAGE
}

log_info() {
    [[ "$VERBOSE" -eq 1 ]] && printf '[INFO] %s\n' "$1"
}

die() {
    printf '[ERROR] %s\n' "$1" >&2
    exit 1
}

cleanup() {
    :
}
trap cleanup EXIT

while getopts ":vo:h" opt; do
    case "$opt" in
        v) VERBOSE=1 ;;
        o) OUTPUT_DIR=$OPTARG ;;
        h) usage; exit 0 ;;
        :) die "옵션 -$OPTARG는 인수가 필요합니다" ;;
        \?) die "알 수 없는 옵션: -$OPTARG" ;;
    esac
done
shift "$((OPTIND - 1))"

INPUT_FILE=${1:-}
[[ -n "$INPUT_FILE" ]] || { usage >&2; exit 1; }
[[ -f "$INPUT_FILE" ]] || die "입력 파일을 찾을 수 없음: $INPUT_FILE"
mkdir -p "$OUTPUT_DIR"

log_info "$INPUT_FILE 처리 중"
# 여기에 스크립트 로직을 추가하세요.

템플릿을 짧게 유지하세요. 여러 스크립트가 실제로 필요할 때만 공유 함수를 추가하세요. 템플릿은 반복되는 설정 작업을 제거해야 하며, 모든 스크립트를 프레임워크처럼 느끼게 해서는 안 됩니다.