Linux Bash shell script

Bash 디버깅 옵션: `set -x`와 `set -e` 사용법

임베디드 친구 2025. 2. 3. 08:50
728x90
반응형

Bash 스크립트를 작성하다 보면 예상치 못한 오류가 발생하거나, 코드의 흐름을 추적해야 할 때가 있습니다. 이럴 때 유용하게 사용할 수 있는 두 가지 디버깅 옵션이 있습니다: set -xset -e. 이번 글에서는 이 두 옵션의 기능과 사용법을 상세히 설명하고, 예제 코드를 통해 실전 활용법을 알아보겠습니다.


1. set 명령어란?

set 명령어는 Bash에서 셸 옵션을 설정하거나 해제할 때 사용하는 명령어입니다. 다양한 옵션 중 디버깅에 유용한 옵션은 -x-e입니다.

주요 옵션

  • -x: 실행되는 명령어를 터미널에 출력합니다. 스크립트의 실행 흐름을 파악할 때 유용합니다.
  • -e: 명령어가 실패하면 즉시 스크립트를 종료합니다. 오류를 사전에 감지하고 처리할 때 유용합니다.

2. set -x: 실행 흐름 추적하기

set -x 옵션은 스크립트에서 실행되는 명령어를 출력합니다. 이를 통해 스크립트가 어떤 순서로 실행되고 있는지 쉽게 추적할 수 있습니다.

사용법

#!/bin/bash
set -x

echo "Hello, World!"
ls non_existent_file  # 존재하지 않는 파일

echo "This line will still execute."

출력 예시

+ echo Hello, World!
Hello, World!
+ ls non_existent_file
ls: cannot access 'non_existent_file': No such file or directory
+ echo This line will still execute.
This line will still execute.
  • + 기호 뒤에 실행된 명령어가 표시됩니다.
  • 에러가 발생했더라도 스크립트는 계속 실행됩니다.

3. set -e: 오류 발생 시 스크립트 종료하기

set -e 옵션은 명령어 실행 중 오류가 발생하면 스크립트를 즉시 종료합니다. 이는 예기치 않은 오류로 인한 추가 실행을 방지합니다.

사용법

#!/bin/bash
set -e

echo "Starting script."
ls non_existent_file  # 존재하지 않는 파일

echo "This line will not execute."

출력 예시

Starting script.
ls: cannot access 'non_existent_file': No such file or directory
  • 오류가 발생한 후 스크립트가 즉시 종료되므로 마지막 echo 명령어는 실행되지 않습니다.

4. set -xset -e 함께 사용하기

두 옵션을 조합하여 디버깅과 오류 방지를 동시에 수행할 수 있습니다.

예제

#!/bin/bash
set -x
set -e

echo "Starting script."
mkdir test_directory
cd test_directory
ls non_existent_file  # 존재하지 않는 파일

echo "This line will not execute."

출력 예시

+ echo Starting script.
Starting script.
+ mkdir test_directory
+ cd test_directory
+ ls non_existent_file
ls: cannot access 'non_existent_file': No such file or directory
  • set -x로 실행 흐름을 확인하면서, set -e로 오류 발생 시 즉시 종료합니다.
  • 오류 발생 시 그 시점까지의 실행 흐름을 확인할 수 있습니다.

5. 스크립트 내에서 옵션 제어하기

특정 부분에서만 옵션을 활성화하거나 비활성화하고 싶을 때는 set 명령어를 스크립트 내부에서 사용하면 됩니다.

예제

#!/bin/bash
set -e

echo "Starting script."

# 디버깅 활성화
set -x
mkdir test_directory
cd test_directory
set +x  # 디버깅 비활성화

ls non_existent_file  # 이 줄에서 오류 발생 시 스크립트 종료

echo "This line will not execute."

출력 예시

Starting script.
+ mkdir test_directory
+ cd test_directory
ls: cannot access 'non_existent_file': No such file or directory
  • set -xset +x를 사용해 디버깅을 특정 범위에서만 활성화할 수 있습니다.

6. 실전에서의 활용 사례

예제 1: 배포 스크립트

배포 과정에서 오류가 발생하면 즉시 중단하고 디버깅 정보를 출력하도록 설정합니다.

#!/bin/bash
set -ex

echo "Starting deployment."
scp app.tar.gz user@server:/path/to/deploy
ssh user@server "cd /path/to/deploy && tar -xzf app.tar.gz"
echo "Deployment completed."

예제 2: 테스트 자동화 스크립트

테스트 중 오류가 발생하면 즉시 중단하고, 실행된 명령어를 기록합니다.

#!/bin/bash
set -ex

echo "Running tests."
pytest tests/
echo "All tests passed."

7. 주의사항

  • set -e는 모든 오류를 감지하지는 않습니다. 예를 들어, 파이프라인에서 발생한 오류는 무시될 수 있습니다. 이를 방지하려면 set -o pipefail 옵션을 추가로 사용해야 합니다.

예제

#!/bin/bash
set -e
set -o pipefail

echo "Starting script."
cat non_existent_file | grep "text"
echo "This line will not execute."

8. 결론

Bash 스크립트 디버깅은 간단한 설정으로 시작할 수 있습니다. set -x를 사용해 실행 흐름을 추적하고, set -e를 통해 오류를 방지하세요. 두 옵션을 적절히 조합하면 더욱 안정적이고 디버깅이 용이한 스크립트를 작성할 수 있습니다.

반응형