트랩(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는 복잡한 스크립트에서 유용할 수 있지만, 잘못 사용될 경우 예상치 못한 중단이 발생할 수 있으므로 주의가 필요합니다.
'프로그래밍 > Linux' 카테고리의 다른 글
[Linux] 쉘 스크립트(shell script) - 7편 서비스 등록(systemd) (0) | 2023.08.31 |
---|---|
[Linux] 쉘 스크립트(Shell script) 6편 - shellcheck(쉘체크) (0) | 2023.08.31 |
[Linux] 쉘 스크립트(Shell script) 4편 - 디버그 모드, 에러메시지 출력 (0) | 2023.08.31 |
[Linux] 쉘 스크립트(Shell script) 3편 - 배경 작업 및 작업 제어 (0) | 2023.08.31 |
[Linux] 쉘 스크립트(Shell script) 2편 - 함수와 파라미터, 사용자 입력과 출력 (0) | 2023.08.31 |