[유닉스] 쉘 스크립트(Shell Script) 디버깅


디버깅 오류 발생

  • 복잡한 스크립트를 작성하다 보면 오류가 자주 발생
  • 구문 오류는 바로 확인하여 수정 가능
  • 실행 오류는 추적하기 쉽지 않음
  • 쉘은 별도의 디버거를 제공하진 않지만 각 행의 실행을 추적할 수 있는 방법 제공

bash –x를 이용한 디버깅

  • 가장 많이 사용되며, 간단한 스크립트 디버깅 방법
  • -x 옵션으로 실행하면 각 행이 실행될 때마다 화면에 출력
$ bash x test_while
+count=1
+sum=0
+(( count<=10 ))
+(( sum+=count ))
......
+let count+=1
+(( count<=10 ))
+echo Sum(1-10) : 55
Sum(1~10) : 55
$
  • +로 시작하는 행은 스크립트의 내용
  • 가장 마지막의 +가 없는 행은 echo 명령에 의해 표준 출력으로 나오는 내용

trap을 이용한 디버깅

  • bash –x 방법은 기본 실행 여부를 확인할 수는 있지만 실제 변수 안에 저장되는 값을 알 수 없다는 단점이 있음
  • 스크립트 안에서 시그널을 처리하는 trap을 이용해 해결
$ cat n test_trap
    1 #!/bin/bash
    2 # test_trap : trap 테스트하는 스크립트
    3 #
    4
    5 trap echo “$LINENO : count=$count”’ DEBUG
    6 count=1
    7 sum=0
    8 while (( count<=10 ))
    9 do
    10    (( sum+=count ))
    11    let count+=1
    12 done
    13
    14 echo Sum(1~10) : $sum
$
  • 실행 결과
    • 5행이 시그널 처리를 위해 추가된 부분
    • 시그널은 실행 중인 프로세스에 정보를 전달하는 메시지
    • 가장 대표적인 시그널이 프로세스를 종료시키는 ^C
    • DEBUG 시그널은 쉘이 스크립트를 디버깅하기 위해 생성하는 시그널로 스크립트의 명령이 생성될 때마다 생성됨
    • 5행에서 trap 명령은 DEBUG 시그널을 받으면 echo 문을 실행
    • 디버깅이 완료되면 trap 명령 앞에 #을 추가해 주석으로 처리
$ chmod +x test_trap
6 : count=
7 : count=1
8 : count=1
10 : count=2
11 : count=2
......
10 : count=10
11 : count=10
8 : count=11
14 : count=11
Sum(1~10) : 55
$