Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스에서 셸 스크립트 디버깅 모드를 활성화하는 방법

스크립트(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

셸 스크립트 디버깅 모드 활성화 방법

셸 스크립트 디버깅에 사용되는 주요 옵션은 다음과 같습니다:

  1. -v(verbose의 약자) – 셸이 스크립트의 모든 줄을 읽으면서 화면에 표시하도록 하며, 상세(verbose) 모드를 활성화합니다.
  2. -n(noexec 또는 no execution의 약자) – 셸이 모든 명령어를 읽기만 하고 실행하지 않도록 합니다. 이 옵션은 문법 검사(syntax checking) 모드를 활성화합니다.
  3. -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와 계속 함께해 주세요.