스크립트(script)란 파일에 저장된 명령어 목록에 불과합니다. 터미널에서 매번 명령어를 하나씩 입력해 실행하는 대신, 시스템 사용자는 여러 명령어를 파일에 저장해 두고 필요할 때마다 해당 파일을 호출함으로써 동일한 작업을 반복해서 실행할 수 있습니다.
셸 스크립팅을 배우기 시작하는 초기 단계에서는 보통 몇 줄로 구성된 짧은 스크립트를 작성하게 됩니다. 이 단계에서는 스크립트의 출력 결과를 눈으로 확인하고 의도한 대로 동작하는지 살펴보는 것만으로도 충분히 디버깅이 가능합니다.
그러나 시스템 설정을 변경하거나 네트워크를 통해 중요한 백업을 수행하는 등 수천 줄에 달하는 복잡하고 고급스러운 스크립트를 작성하게 되면, 출력 결과만 확인해서는 스크립트 내부의 버그를 찾아내기 어렵다는 사실을 깨닫게 됩니다.
따라서 이번 리눅스 셸 스크립트 디버깅 시리즈에서는 셸 스크립트 디버깅을 활성화하는 방법을 먼저 살펴보고, 이후 연재에서 다양한 디버깅 모드의 종류와 실제 활용 방법을 자세히 설명하겠습니다.
스크립트 시작 방법
스크립트는 첫 번째 줄에 #!(쉐뱅(she-bang) – 파일 유형을 정의)와 인터프리터 경로가 포함되어 있다는 점에서 다른 파일과 구별됩니다. 이 줄은 해당 파일이 지정된 프로그램(인터프리터)에 의해 해석될 명령어들의 모음임을 시스템에 알려주는 역할을 합니다.
다양한 종류의 스크립트에서 사용되는 "첫 줄"의 예시는 다음과 같습니다:
#!/bin/sh [sh 스크립팅용] #!/bin/bash [bash 스크립팅용] #!/usr/bin/perl [perl 프로그래밍용] #!/bin/awk -f [awk 스크립팅용]
참고: 스크립트가 표준 시스템 명령어만으로 구성되어 있고 내부 셸 지시문이 없다면, 첫 줄 즉 #!는 생략할 수 있습니다.
리눅스에서 셸 스크립트 실행하기
셸 스크립트를 호출하는 일반적인 문법은 다음과 같습니다:
$ script_name argument1 ... argumentN
또 다른 방법은 아래처럼 스크립트를 실행할 셸을 명시적으로 지정하는 것입니다:
$ shell script_name argument1 ... argumentN
예시:
$ /bin/bash script_name argument1 ... argumentN [bash 스크립팅용] $ /bin/ksh script_name argument1 ... argumentN [ksh 스크립팅용] $ /bin/sh script_name argument1 ... argumentN [sh 스크립팅용]
아래 예시처럼 #!로 시작하지 않고 기본 시스템 명령어만 포함하는 스크립트라면:
#표준 시스템 명령어를 담은 스크립트 cd /home/$USER mkdir tmp echo "/home/$USER 아래에 tmp 디렉터리가 생성되었습니다"
실행 권한을 부여한 뒤 다음과 같이 실행하면 됩니다:
$ chmod +x script_name $ ./script_name
셸 스크립트 디버깅 모드 활성화 방법
셸 스크립트 디버깅에 사용되는 주요 옵션은 다음과 같습니다:
-v(verbose의 약자) – 셸이 스크립트의 모든 줄을 읽으면서 화면에 표시하도록 하며, 상세(verbose) 모드를 활성화합니다.-n(noexec 또는 no execution의 약자) – 셸이 모든 명령어를 읽기만 하고 실행하지 않도록 합니다. 이 옵션은 문법 검사(syntax checking) 모드를 활성화합니다.-x(xtrace 또는 execution trace의 약자) – 셸이 명령어와 인수를 실행하면서 터미널에 표시하도록 합니다. 이 옵션은 셸 추적(shell tracing) 모드를 활성화합니다.
1. 셸 스크립트의 첫 줄 수정하기
첫 번째 방법은 아래와 같이 셸 스크립트의 첫 줄을 수정하는 것으로, 이렇게 하면 스크립트 전체에 대한 디버깅이 활성화됩니다.
#!/bin/sh option(s)
위 형식에서 option은 앞서 소개한 디버깅 옵션 중 하나 또는 여러 개의 조합이 될 수 있습니다.
2. 디버깅 옵션과 함께 셸 호출하기
두 번째 방법은 아래와 같이 디버깅 옵션을 지정하여 셸을 호출하는 것이며, 이 역시 스크립트 전체의 디버깅을 켭니다.
$ shell option(s) script_name argument1 ... argumentN
예시:
$ /bin/bash option(s) script_name argument1 ... argumentN
3. set 셸 내장 명령어 사용하기
세 번째 방법은 set 내장 명령어를 사용하여 함수처럼 스크립트의 특정 구간만 디버깅하는 것입니다. 이 방법은 셸 스크립트의 어느 부분에서든 디버깅을 활성화할 수 있다는 점에서 특히 유용합니다.
디버깅 모드를 켜려면 아래 형식처럼 set 명령어를 사용합니다(option은 디버깅 옵션 중 하나):
$ set option
디버깅 모드를 활성화하려면:
$ set -option
디버깅 모드를 비활성화하려면:
$ set +option
또한 스크립트의 서로 다른 구간에서 여러 디버깅 모드를 활성화했다면, 다음과 같이 한 번에 모두 끌 수 있습니다:
$ set -
지금까지 셸 스크립트 디버깅 모드를 활성화하는 방법을 알아보았습니다. 살펴본 것처럼 스크립트 전체를 디버깅할 수도 있고, 특정 구간만 선택적으로 디버깅할 수도 있습니다.
다음 두 편의 시리즈에서는 셸 스크립트 디버깅 옵션을 활용해 상세(verbose), 문법 검사(syntax checking), 셸 추적(shell tracing) 디버깅 모드를 실제 예제와 함께 설명하겠습니다.
이 가이드에 대해 궁금한 점이 있거나 피드백을 나누고 싶으시다면 아래 댓글 섹션을 통해 의견을 남겨주세요. 그때까지 Tecmint와 계속 함께해 주세요.