본문 바로가기
IT 기술/프로그래밍관련

[bash] script debugging

by 땅뚱 2013. 10. 11.

bash script 를 debugging 하는 방법을 설명한다. echo 를 넣어서 디버깅을 할 수도 있지만, 비효율적이다. set -o 옵션을 사용하면 echo 보다 나은 디버깅 기능을 사용할 수 있다.

 

set 옵션

 

set 옵션은 -o 로 켜고, +o 로 기능을 끈다. 즉 verbose 모드를 on 시킬 경우, set -o verbose, off 시킬 경우 set +o verbose 명령을 사용한다. bash 를 직접 실행할 때, set 옵션을 준 것과 동일한 옵션을 주어 실행할 수 있다. 즉 xtrace 옵션을 사용하고 싶다면, set -o xtrace 라고 주어도 되고, bash -x <script name> 이라고 주어도 된다. 아래 표를 참조한다.

 

 set -o 옵션  명령행 옵션  동작 
 noexec  -n  명령을 실행하지 않고 문법 오류만 검사한다. 대화형 스크립트에서는 무시된다.
 verbose  -v  명령을 실행하기 전에 화면에 출력한다.
 xtrace  -x  명령행을 처리한 다음 명령을 화면에 출력한다.
 noglob  -f  경로명을 확장하지 않는다. (metacharacter 를 사용한 파일 이름 확장을 하지않음. 즉 * 같은 특수문자를 사용할 수 없다)

 

<example> xtrace 예제

willy:~/scripts> bash -x script1.sh
+ clear

+ echo 'The script starts now.'
The script starts now.
+ echo 'Hi, willy!'
Hi, willy!
+ echo

+ echo 'I will now fetch you a list of connected users:'
I will now fetch you a list of connected users:
+ echo

+ w
  4:50pm  up 18 days,  6:49,  4 users,  load average: 0.58, 0.62, 0.40
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     tty2     -                Sat 2pm  5:36m  0.24s  0.05s  -bash
willy	 :0       -                Sat 2pm   ?     0.00s   ?     -
willy	 pts/3    -                Sat 2pm 43:13  36.82s 36.82s  BitchX willy ir
willy    pts/2    -                Sat 2pm 43:13   0.13s  0.06s  /usr/bin/screen
+ echo

xtrace 는 각 행을 '+' 로 시작한다. 이것은 PS4 에 설정되어있는 쉘변수에 저장된 값이다. 이를 변경하고 싶으면 마음대로 변경해서 사용할 수 있다.

 

script 안에서 특정 부분에서만 해당 옵션을 사용하고 싶을 경우에는 set -o / +o 옵션을 사용한다. 아래 예제의 경우 w 에 대해서만 xtrace 를 실행한다.

echo 'The script starts now.'
echo 'I will now fetch you a list of connected users:'
echo
set -x        # activate debugging from here
w 
set +x            # stop debugging from here

 

Trap 명령 사용

 

trap 의 EXIT / DEBUG 명령을 사용해서 디버깅하는데 사용할 수 있다.

trap 'echo Thank uou for playing!' EXIT

우선 EXIT 신호의 경우 EXIT 될 때, 변수의 값을 보고 싶을 경우에 유용하게 사용할 수 있다.

function dbgtrap
{
    echo "badvar is badvar"
}

trap dbgtrap DEBUG
...
디버깅이 필요한 부분
...

trap - DEBUG

DEBUG 신호의 경우 매 구문마다 trap 이 발생되기 때문에, 특정 변수의 값이 이상하게 변경될 경우 그 위치를 찾아낼 때 유용하게 사용할 수 있다. DEBUG 신호의 경우 trap 으로 호출된 함수 내부에서는 DEBUG trap 이 동작하지 않는다는 것을 생각하고 명확하게 trap 용 호출 함수를 정의해주어야 한다.