본문 바로가기
프로그래밍/Linux

[Linux] 쉘 스크립트(Shell script) 5편 - 트랩(trap) 사용하기, 에러 옵션(set -e, set -o)

by HI_Ai 2023. 8. 31.
반응형

트랩(trap) 사용하기

trap 명령어는 시그널을 잡아내어 해당 시그널을 받았을 때 실행할 명령이나 작업을 정의할 수 있게 해줍니다. 즉, 특정 상황(예: 스크립트 종료, 오류 발생 등)에서 원하는 명령을 실행하도록 설정하는 도구입니다.
스크립트가 비정상적으로 종료될 때나 특정 시그널을 받을 때 정리 작업이나 로깅 작업 등을 수행하고자 할 때 유용하게 사용될 수 있습니다.

기본 구조:

trap 'commands' signals

 

 

예시 1: 정리 작업을 위한 trap

아래의 스크립트는 일부 작업을 수행한 후 종료될 때 정리 작업을 수행합니다.

#!/bin/bash

# 정리 작업을 위한 함수 정의
cleanup() {
  echo "Cleaning up temporary files..."
  rm -f /tmp/my_temp_file*
}

# EXIT 시그널을 받았을 때 cleanup 함수 실행
trap cleanup EXIT

# 임시 파일 생성
touch /tmp/my_temp_file_1 /tmp/my_temp_file_2

echo "Doing some work..."
sleep 2

위의 예시에서는, trap 명령어가 EXIT 시그널에 반응하여 스크립트가 종료될 때마다 cleanup 함수를 실행합니다. cleanup 함수는 임시 파일을 삭제하는 작업을 합니다.

스크립트 실행시 'Doing some work...' 메시지 출력 후 2초 대기한 이후 스크립트가 종료됩니다. 스크립트가 종료될 때 'trap'에 의해 설정된 'cleanup'함수가 호출되어 임시 파일들이 삭제됩니다.

 

예시 2: 오류 발생 시 메시지 출력하기

이 예시에서는 스크립트 내에서 오류가 발생하면 사용자에게 메시지를 보여주는 기능을 구현해보겠습니다.

#!/bin/bash

on_error() {
  echo "An error occurred in the script. Exiting now..."
}

# ERR 시그널을 받았을 때 on_error 함수 실행
trap on_error ERR

# 일부 작업 수행
echo "Working..."
sleep 2
echo "working..."
sleep 2
false # 항상 실패하는 명령을 실행하여 ERR 시그널 발생


스크립트 실행 시, working이라는 문장이 2초 간격으로 2번 생성 후 false 명령으로 인해 ERR 시그널이 발생하며 on_error 함수가 호출되어 오류 메시지가 출력됩니다.

이러한 방식으로 trap을 활용하면 스크립트의 예외 처리나 특정 상황에서의 추가 작업을 보다 간편하게 구현할 수 있습니다.

 


에러 옵션 (set -e, set -o errexit)

리눅스 쉘 스크립트를 작성할 때, 명령이 실패하면 스크립트를 중지하고 싶을 수 있습니다. 이러한 동작은 set -e 또는 set -o errexit 명령어를 사용하여 활성화 할 수 있습니다. 이 옵션은 스크립트 내의 어떤 명령이라도 실패하면 즉시 스크립트 실행을 중단합니다.

 

set -e

set -e 명령어를 활용하면 스크립트 내 명령 실패시 스크립트 실행이 즉시 중지됩니다. set -e는 짧고 간결한 특징이 있습니다.

예제

#!/bin/bash

set -e

echo "This will be printed."
false # 항상 실패하는 명령
echo "This will NOT be printed."

위의 스크립트를 실행하면 다음의 결과가 출력됩니다:

This will be printed.

false 명령어가 실행되고 set -e로 인해 그 자리에서 스크립트가 중지되기 때문에 "This will NOT be printed."는 출력되지 않습니다.

 

set -o errexit

set -o errexit은 set -e보다 더 명시적이며 스크립트를 처음 보는 사람이 해당 옵션의 기능을 조금 더 이해하기 쉽습니다.

#!/bin/bash

set -o errexit

echo "This is the start of the script."
false # 항상 실패하는 명령
echo "This line will not be printed."

위의 스크립트를 실행하면, false 명령어 실행 후 스크립트가 중단됩니다. 따라서 마지막 줄은 출력되지 않습니다.

 

This is the start of the script.

결과적으로, set -e와 set -o errexit는 동일한 기능을 제공하므로, 어느 쪽을 사용할지는 주로 개인의 선호나, 팀의 코딩 규칙에 따라 결정됩니다.

 

조합 사용

set -e와 trap을 함께 사용하면 에러 발생 시 추가적인 작업을 수행할 수 있습니다.

예제:

#!/bin/bash

error_handler() {
  echo "An error occurred. Exiting..."
}

trap error_handler ERR

set -e

echo "Starting script..."
false
echo "This won't be executed."

이 스크립트에서 false 명령어는 실패하므로 set -e에 의해 스크립트가 중지되며, trap에 의해 error_handler 함수가 호출됩니다.

 

결과:

Starting script...
An error occurred. Exiting...

set -e는 복잡한 스크립트에서 유용할 수 있지만, 잘못 사용될 경우 예상치 못한 중단이 발생할 수 있으므로 주의가 필요합니다.

반응형