일반적인 Bash 스크립팅 함정과 피하는 방법
Bash 스크립팅은 자동화, 시스템 관리 및 신속한 프로토타이핑에 필수적인 도구입니다. 그러나 Bash의 유연성과 강력한 단순성은 모범 사례를 무시할 경우 미묘한 오류, 보안 취약성 및 이식성 문제로 이어질 수도 있습니다. 견고한 스크립트는 예상치 못한 입력을 처리하고, 오류를 우아하게 관리하며, 유지 관리 가능해야 합니다.
이 종합 가이드에서는 Bash 스크립팅에서 발생하는 가장 일반적인 함정을 살펴보고, 안전하고 안정적이며 효율적인 스크립트를 작성하는 데 도움이 되는 실행 가능한 솔루션, 최신 모범 사례 및 코드 예제를 제공합니다.
1. 스크립트 안전 기본 설정
\많은 가장 파괴적인 함정은 침묵하는 실패에서 비롯됩니다. 스크립트 시작 부분에 중요한 옵션을 설정하면 Bash가 더 엄격해지고 오류 발생 시 즉시 실행을 중지하도록 강제합니다.
함정: 명령 실패 무시
기본적으로 Bash는 파이프라인 또는 시퀀스의 이전 명령이 실패하더라도(0이 아닌 종료 상태 반환) 후속 명령을 계속 실행하는 경우가 많습니다.
솔루션: 엄격한 오류 확인 활성화 (set -e)
set -e(errexit)를 사용하면 명령이 실패할 경우 스크립트가 즉시 종료됩니다. 이렇게 하면 연쇄 오류를 방지하고 잘못된 데이터를 기반으로 파괴적인 명령을 실행하는 것을 방지할 수 있습니다.
#!/usr/bin/env bash
set -e # 명령이 0이 아닌 상태로 종료되면 즉시 종료합니다.
# set -e가 도움이 되는 예시:
mkdir /tmp/temp_dir_that_exists # 성공(종료 코드 0)
rm -rf non_existent_file # 실패(종료 코드 > 0)
# set -e가 없으면 스크립트가 여기서 계속 실행되어 실패를 은폐할 수 있습니다.
# set -e가 있으면 스크립트가 즉시 종료됩니다.
함정: 초기화되지 않은 변수 사용
변수 이름의 오타($FILE_NAME 대신 $FIEL_NAME)는 변수가 빈 문자열로 확장되어 잠재적으로 치명적인 결과를 초래할 수 있습니다(예: 디렉터리 경로 변수가 정의되지 않은 경우 rm -rf /).
솔루션: 변수 초기화 요구 (set -u)
set -u(nounset)를 사용하면 초기화되지 않은 변수를 사용하려고 할 때 스크립트가 즉시 종료됩니다.
#!/usr/bin/env bash
set -u
echo "파일은: $FILE_PATH"입니다.
# FILE_PATH가 이전에 정의되지 않은 경우 여기서 스크립트가 실패합니다.
2. 따옴표 및 변수 확장 함정
따옴표 없는 변수는 스크립팅 오류의 가장 큰 단일 원인이며, 특히 공백이 포함된 파일 이름이나 경로를 다룰 때 더욱 그렇습니다.
함정: 변수 따옴표 잊기
공백이 포함된 변수에 따옴표가 없으면 Bash는 변수 값을 여러 개의 별도 인수로 취급합니다.
솔루션: 변수 확장에 항상 큰따옴표 사용
큰따옴표(`"