셸 스크립트 디버깅 시리즈의 첫 번째 글에서는 다양한 디버깅 옵션과 셸 스크립트 디버깅 모드를 활성화하는 방법을 소개했습니다.
셸 스크립트를 작성한 후에는 실행하기 전에 스크립트의 구문을 먼저 점검하는 것이 좋습니다. 출력 결과를 하나씩 확인하며 정상 동작 여부를 판단하는 것보다 훨씬 효율적이기 때문입니다.
이번 글에서는 구문 검사(syntax checking) 디버깅 모드를 사용하는 방법을 살펴보겠습니다. 앞서 설명한 여러 디버깅 옵션들을 기억하시고, 이번에는 이를 실제로 활용해 스크립트를 디버깅해 보겠습니다.
상세 출력(Verbose) 디버깅 모드 활성화하기
본격적인 주제로 들어가기 전에, 상세 출력(verbose) 모드를 간단히 짚고 넘어가겠습니다. 이 모드는 -v 디버깅 옵션으로 활성화되며, 셸이 스크립트의 모든 줄을 읽는 즉시 화면에 표시하도록 지시합니다.
동작 방식을 보여드리기 위해 PNG 이미지를 JPG 형식으로 일괄 변환하는 샘플 셸 스크립트를 준비했습니다.
아래 내용을 파일에 입력하거나 복사하여 붙여넣으세요.
#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0
파일을 저장한 후 아래 명령어로 스크립트에 실행 권한을 부여합니다.
$ chmod +x script.sh
스크립트를 실행하면서 셸이 읽는 대로 모든 줄을 화면에 표시하려면 다음과 같이 입력합니다.
$ bash -v script.sh
셸 스크립트에서 구문 검사 디버깅 모드 활성화하기
이제 핵심 주제로 돌아가겠습니다. -n 옵션은 구문 검사 모드를 활성화합니다. 이 옵션은 셸에게 스크립트의 모든 명령어를 읽도록 지시하지만 실제로는 실행하지 않으며, 오직 사용된 구문만 검사합니다.
셸 스크립트에 오류가 있으면 셸이 터미널에 오류 메시지를 출력하고, 문제가 없으면 아무것도 표시하지 않습니다.
구문 검사를 활성화하는 기본 구문은 다음과 같습니다.
$ bash -n script.sh
현재 스크립트의 구문은 올바르기 때문에 위 명령은 어떤 출력도 표시하지 않습니다. 그렇다면 for 루프를 닫는 done 키워드를 일부러 제거하고 오류가 표시되는지 확인해 보겠습니다.
아래는 버그가 포함된, PNG 이미지를 JPG 형식으로 일괄 변환하는 수정된 셸 스크립트입니다.
#!/bin/bash
#script with a bug
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
파일을 저장한 후 구문 검사를 수행하면서 실행합니다.
$ bash -n script.sh
위 출력 결과에서 스크립트에 구문 문제가 있음을 확인할 수 있습니다. for 루프에 닫는 done 키워드가 빠져 있는 것입니다. 셸은 파일 끝까지 done을 찾았지만 발견하지 못했고, 그 결과 다음과 같은 구문 오류를 출력했습니다.
script.sh: line 11: syntax error: unexpected end of file
또한 상세 출력 모드와 구문 검사 모드를 함께 결합해서 사용할 수도 있습니다.
$ bash -vn script.sh
또는 다음 예제처럼 스크립트의 첫 번째 줄(쉐뱅 라인)을 수정하여 구문 검사를 활성화할 수도 있습니다.
#!/bin/bash -n
#altering the first line of a script to enable syntax checking
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
앞서와 마찬가지로 파일을 저장한 후 구문 검사를 수행하면서 실행합니다.
$ ./script.sh script.sh: line 12: syntax error: unexpected end of file
추가로, set이라는 셸 내장(built-in) 명령을 사용하여 스크립트 내에서 직접 디버깅 모드를 활성화할 수도 있습니다.
아래 예제에서는 스크립트 중 for 루프 부분의 구문만 선택적으로 검사합니다.
#!/bin/bash
#using set shell built-in command to enable debugging
#convert
#enable debugging
set -n
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#disable debugging
set +n
exit 0
파일을 저장한 후 다시 한번 스크립트를 실행합니다.
$ ./script.sh
마치며
정리하자면, 셸 스크립트를 실행하기 전에는 반드시 구문 검사를 수행하여 오류를 사전에 잡아내는 습관을 들이는 것이 좋습니다. 이렇게 하면 불필요한 실행 실패나 예기치 않은 동작을 미리 방지할 수 있습니다.
이 가이드에 대해 궁금한 점이나 피드백이 있다면 아래 응답 양식을 통해 보내주시기 바랍니다. 시리즈 세 번째 파트에서는 셸 추적(tracing) 디버깅 모드의 개념과 활용 방법을 다룰 예정입니다.