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 용 호출 함수를 정의해주어야 한다.
'IT 기술 > 프로그래밍관련' 카테고리의 다른 글
[python] snakefood : module dependency check (0) | 2014.06.25 |
---|---|
[Python] str() 과 repr() 의 차이 (3) | 2014.06.17 |
[bash] 5th - Trap Statement (0) | 2013.08.01 |
[linux] openat / open 의 차이점 (0) | 2012.12.28 |
[bash] 4th - 명령행 옵션과 유형 변수 (0) | 2012.09.26 |