bash 스크립트를 디버깅하는 방법은 무엇입니까?

How Debug Bash Script




모든 프로그램은 소비자에게 도달하기 전에 오류가 없어야 합니다. 소프트웨어 개발자는 소프트웨어 프로그램에 버그가 없도록 최선을 다합니다. 그러나 수천 줄의 코드가 있으면 오류가 없는 코드를 만들기가 어렵습니다. 디버깅은 진행 중인 프로세스입니다. 오류를 즉시 감지하고 코드에 대한 중요한 정보를 수집하며 중복 코드 청크를 제거하는 데 도움이 됩니다.

모든 프로그래밍 언어에는 버그를 찾기 위한 몇 가지 공통적이고 몇 가지 독특한 접근 방식이 있습니다. 예를 들어, 디버깅 프로그램을 사용하여 오류를 빠르게 제거할 수 있습니다. 쉘 스크립팅에는 코드를 디버깅하는 특정 도구가 없습니다. 이 글은 bash 스크립트를 오류 없이 만드는 데 사용할 수 있는 다양한 디버깅 기술에 대해 설명합니다. 방법에 대해 알아보기 전에 쉘과 쉘 스크립팅에 대한 기본적인 이해를 합시다.







Linux에서 쉘이란 무엇입니까?

컴퓨터를 부팅할 때 커널은 연결된 하드웨어에 대한 정보를 얻고 연결된 다른 구성 요소가 상호 작용할 수 있도록 합니다. 그 외에도 메모리, CPU를 관리하고 새로운 주변 장치를 인식합니다. 대체로 커널은 모든 운영 체제의 중추입니다. 그러나 커널과 직접 상호 작용하여 특정 작업을 수행하도록 명령하는 것을 생각해 본 적이 있습니까? 그렇게 하는 것이 실행 가능합니까? 전적으로! 대화형 인터페이스가 있는 컴퓨터 프로그램인 셸의 도움으로 누구나 커널을 조작할 수 있습니다. 쉘을 사용하면 인간이 커널과 상호 작용하고 모든 작업을 수행하도록 지시할 수 있습니다.



Unix에는 두 가지 주요 쉘이 있습니다. 본 쉘 그리고 C 쉘 . 두 유형 모두 하위 범주가 있습니다. Bourne 쉘의 다른 유형은 다음과 같습니다. Korn shell(ksh), Almquist shell(ash), Bourne again shell(bash), 그리고 Z 쉘(zsh) . 동시에 C 쉘에는 다음과 같은 자체 하위 범주가 있습니다. C 쉘(csh) 그리고 TENEX C 쉘 (티시) . 위에서 언급했듯이 모든 쉘 중에서, Bash(Bourne Again 쉘) 가장 널리 사용되는 셸이며 효율성과 사용자 친화성으로 인해 많은 Linux 배포판에서 즉시 사용할 수 있습니다.



Bash는 많은 Linux 배포판의 기본 셸이며 수백만 명의 Linux 사용자가 광범위하게 사용합니다. GUI 기반 응용 프로그램에서 일반적으로 수행하는 모든 작업을 수행할 수 있을 정도로 다양하고 영향력이 있습니다. 파일을 편집하고, 파일을 관리하고, 사진을 보고, 음악을 듣고, 비디오를 재생하는 등의 작업을 수행할 수 있습니다.





쉘 스크립트란 무엇입니까?

쉘의 기본 개념을 배웠으니 이제 쉘 스크립팅으로 넘어갑시다. 쉘 스크립트는 특정 기능을 수행하기 위해 인터프리터 역할을 하는 쉘에서 여러 명령을 실행하는 컴퓨터 프로그램입니다. 위에서 논의한 바와 같이 2가지 특정 유형의 쉘이 있습니다. 그러나 이 가이드는 Bourne Again 셸(Bash)에 중점을 두고 있습니다.
그렇다면 bash 스크립트는 무엇입니까? Linux에서 모든 bash 명령은 다음 위치에 저장됩니다. /usr/bin 및 /bin 폴더. 예를 들어, 명령을 실행할 때마다 bash는 디렉토리에 존재하는지 여부를 검색합니다. 다른 디렉토리에서 오류가 발생하면 명령이 실행됩니다.

터미널에서 여러 명령을 실행해야 하는 작업을 수행하는 것은 어떻습니까? 이 특정 상황에서 bash 스크립팅이 도움이 될 수 있습니다. Bash 스크립팅은 특정 작업을 수행하기 위해 여러 bash 명령을 실행하도록 프로그램을 만들 수 있는 쉘 스크립팅의 한 형태입니다.



bash 스크립팅의 버그는 무엇입니까?

bash 스크립팅이나 다른 프로그래밍 언어로 작업하는 동안 많은 오류가 발생합니다. 버그는 프로그램이 잘못 작동하도록 할 수 있는 프로그램의 오류 또는 오류입니다.

모든 프로그래밍 언어에는 버그를 찾는 고유한 절차가 있습니다. 마찬가지로 bash에는 터미널 프로그램을 디버그하기 위한 많은 내장 옵션이 있습니다.

오류를 관리하고 프로그램을 디버깅하는 것은 번거롭지 않습니다. 이는 시간이 많이 걸리는 작업이며 프로그램을 디버그하는 데 적합한 도구를 알지 못하면 악화될 수 있습니다. 이 글은 스크립트를 오류 없이 만들기 위한 bash 스크립트 디버깅에 대한 완전한 가이드입니다. 시작하겠습니다.

bash 스크립트를 디버그하는 방법:

대규모 프로그래밍 프로젝트에서 작업할 때 많은 오류나 버그가 발생합니다. 프로그램 디버깅은 때때로 복잡할 수 있습니다. 프로그래머는 일반적으로 디버깅 도구를 활용하며 많은 코드 편집기는 구문을 강조 표시하여 버그를 찾는 데 도움을 줍니다.

Linux에는 코드를 디버그하기 위한 다양한 도구가 있습니다(예: gdb라고도 하는 GNU 디버거). GDB와 같은 도구는 바이너리로 컴파일되는 프로그래밍 언어에 유용합니다. bash는 간단한 인터프리터 언어이므로 디버깅을 위해 무거운 도구가 필요하지 않습니다.

bash 스크립팅 코드를 디버깅하는 다양한 기존 기술이 있으며 그 중 하나는 다음을 추가하는 것입니다. 주장. 어설션은 특정 조건을 확인하고 그에 따라 프로그램을 실행하기 위해 프로그램에 추가되는 조건입니다. 버그를 찾고 테스트하는 데에도 도움이 되는 방어 기술입니다. 당신은 많은 것을 찾을 수 있습니다 도구 bash 스크립트에 어설션을 추가하는 데 도움이 됩니다.

어설션을 추가하는 것은 오래된 전통적인 기술 중 하나입니다. bash 스크립트를 디버그하기 위해 bash에서 사용할 수 있는 플래그/옵션 세트가 있습니다. 이러한 옵션은 스크립트에서 shebang과 함께 추가하거나 터미널에서 프로그램을 실행하는 동안 추가할 수 있습니다. 우리가 다룰 주제는 다음과 같습니다.

  1. 활성화하여 bash 스크립트를 디버그하는 방법 장황한 -v 옵션
  2. 다음을 사용하여 bash 스크립트를 디버그하는 방법 추적 -x 옵션
  3. 다음을 사용하여 bash 스크립트를 디버그하는 방법 noexec -n 옵션
  4. 식별 방법 설정되지 않은 변수 bash 스크립트를 디버깅하는 동안
  5. 디버깅 방법 특정 부분 bash 스크립트의
  6. 다음을 사용하여 bash 스크립트를 디버그하는 방법 명령
  7. 제거하여 bash 스크립트를 디버그하는 방법 파일 글로빙 를 사용하여 -NS 옵션
  8. 어떻게 결합시키다 셸 스크립트를 디버그하기 위한 디버깅 옵션
  9. 어떻게 디버그 보고서 리디렉션 파일로

이제 bash 스크립트를 디버그하기 위해 bash에서 다양한 기술을 확인합시다.

1. verbose -v 옵션을 활성화하여 bash 스크립트를 디버그하는 방법:

bash 스크립트를 디버그하는 가장 쉬운 방법 중 하나는 다음을 사용하는 것입니다. -V 상세 옵션이라고도 합니다. 옵션은 shebang으로 추가하거나 실행하는 동안 스크립트 파일 이름과 함께 명시적으로 넣을 수 있습니다. verbose 옵션은 인터프리터의 프로세스로 코드의 모든 라인을 실행하고 인쇄합니다. bash 스크립트 예제로 이해합시다.

#! /bin/bash
던졌다 '1번 입력'
읽다1번
던졌다 '2번 입력'
읽다2 번
만약 [ '$숫자1' -gt '$숫자2' ]
그 다음에
던졌다 '숫자1이 숫자2보다 큽니다'
엘리프 [ '$숫자1' -eq '$숫자2' ]
그 다음에
던졌다 '1번은 2번과 같다'
또 다른
던졌다 '숫자2가 숫자1보다 큽니다'
~이다

위의 코드는 사용자로부터 두 개의 숫자를 얻은 다음 일부 조건문을 수행하여 숫자가 입력된 다른 숫자보다 더 중요한지, 작거나 같은지 확인합니다. bash 스크립팅에는 모든 텍스트 편집기를 사용할 수 있지만 Vim 편집기를 사용하고 있습니다. Vim은 bash 스크립트의 구문을 강조하고 구문 오류의 가능성을 줄이는 강력하고 기능이 풍부한 편집기입니다. Vim 편집기가 없는 경우 아래 언급된 명령을 실행하여 가져옵니다.

$수도적절한설치 내가왔다

다음을 사용하여 bash 스크립트 파일을 만듭니다.

$내가왔다b_script.sh

Vim 편집기를 처음 사용하는 경우 배우는 것이 좋습니다. vim 편집기를 사용하는 방법 진행하기 전에.

이제 스크립트로 돌아가서 다음을 사용하여 스크립트를 실행하십시오. -V 옵션:

$세게 때리다 -Vb_script.sh

위의 출력에서 ​​스크립트의 각 줄이 인터프리터에 의해 처리될 때 터미널에 인쇄되는 것을 볼 수 있습니다. 스크립트는 사용자의 입력을 중지하고 스크립트의 다음 줄을 처리합니다. 위에서 논의한 바와 같이 -V 옵션은 다음과 같이 shebang 뒤에 배치할 수 있습니다.

#! / 빈 / bash -v

마찬가지로 verbose 플래그를 사용하여 shebang의 다음 줄에 추가할 수도 있습니다. 세트 명령:

#! /bin/bash
세트 -V

위에서 설명한 모든 방법으로 자세한 정보를 표시할 수 있습니다.

2 xtrace -x 옵션을 사용하여 bash 스크립트를 디버그하는 방법:

xtrace라고도 하는 실행 추적은 특히 논리적 오류를 추적하는 데 유용하고 스마트한 디버깅 옵션입니다. 논리적 오류는 일반적으로 변수 및 명령과 관련됩니다. 스크립트를 실행하는 동안 변수의 상태를 확인하려면 다음을 사용합니다. -NS 옵션. 이제 다시 실행 b_script.sh 파일 -NS 깃발:

$세게 때리다 -NSb_script.sh

출력은 실행 프로세스 동안 각 변수의 값을 명시적으로 보여줍니다. 다시, -NS set 명령을 사용하여 shebang 옆과 shebang 줄 뒤에 사용할 수 있습니다. xtrace는 스크립트의 각 줄에 + 기호를 넣습니다.

3 noexec -n 옵션을 사용하여 bash 스크립트를 디버그하는 방법:

구문 오류는 버그의 주요 원인 중 하나입니다. bash 스크립트를 구문적으로 디버그하려면 다음을 사용합니다. 노젝 (실행 없음) 모드. noexec 모드에 사용되는 옵션은 -N. 코드를 실행하는 대신 코드의 구문 오류만 표시합니다. 코드 디버깅에 대한 훨씬 안전한 접근 방식입니다. 실행하자 b_script.sh 다시 -N 옵션:

$세게 때리다 -Nb_script.sh

구문 오류가 없으면 코드가 실행되지 않습니다. 이제 코드를 수정해 보겠습니다.

#! /bin/bash

던졌다 '1번 입력'
읽다1번
던졌다 '2번 입력'
읽다2 번
만약 [ '$숫자1' -gt '$숫자2' ]
그 다음에
던졌다 '숫자1이 숫자2보다 큽니다'
엘리프 [ '$숫자1' -eq '$숫자2' ]
#그 다음에
던졌다 '1번은 2번과 같다'
또 다른
던졌다 '숫자2가 숫자1보다 큽니다'
~이다

나는 댓글을 달고 있다 그 다음에 ~ 후에 엘리프 . 이제 -n으로 실행 b_script.sh 스크립트:

$세게 때리다 -Nb_script.sh

예상대로 오류를 명확하게 식별하여 단말기에 표시했습니다.

4 bash 스크립트를 디버깅하는 동안 설정되지 않은 변수를 식별하는 방법:

코드를 작성하는 동안 오타를 만드는 것은 일반적입니다. 종종 변수를 잘못 입력하여 코드가 실행되지 않습니다. 그러한 오류를 식별하기 위해 우리는 -유 옵션. 코드를 다시 수정해 보겠습니다.

#! /bin/bash
던졌다 '1번 입력'
읽다1번
던졌다 '2번 입력'
읽다2 번
만약 [ '$num1' -gt '$숫자2' ]
그 다음에
던졌다 '숫자1이 숫자2보다 큽니다'
엘리프 [ '$숫자1' -eq '$숫자2' ]
그 다음에
던졌다 '1번은 2번과 같다'
또 다른
던졌다 '숫자2가 숫자1보다 큽니다'
~이다

처음에는 만약 조건문, 이름을 변경했습니다. 1번 변수 num1 . 지금 num1 설정되지 않은 변수입니다. 이제 스크립트를 실행합니다.

$세게 때리다 -유b_script.sh

출력은 설정되지 않은 변수의 이름을 식별하고 명시적으로 표시합니다.

5. bash 스크립트의 특정 부분을 디버그하는 방법:

xtrace 모드는 코드의 모든 라인을 처리하고 출력을 제공합니다. 그러나 어떤 부분이 잠재적으로 오류를 일으킬 수 있는지 이미 알고 있다면 큰 코드에서 오류를 찾는 데 시간이 많이 걸릴 것입니다. 운 좋게도 xtrace를 사용하면 코드의 특정 부분을 디버그할 수 있습니다. 세트 명령. 장소 설정 -x 디버깅이 필요한 부분의 시작 부분에 설정 +x 끝에. 예를 들어, 다음 조건문을 디버그하고 싶습니다. b_script.sh , 그래서 나는 모든 조건문을 설정 -x 그리고 설정 +x 아래 코드에 표시된 대로 옵션:

#! /bin/bash
던졌다 '1번 입력'
읽다1번
던졌다 '2번 입력'
읽다2 번
세트 -NS
만약 [ '$숫자' -gt '$숫자2' ]
그 다음에
던졌다 '숫자1이 숫자2보다 큽니다'
엘리프 [ '$숫자1' -eq '$숫자2' ]
그 다음에
던졌다 '1번은 2번과 같다'
또 다른
던졌다 '숫자2가 숫자1보다 큽니다'
~이다
세트+ x

이제 다음을 사용하여 스크립트를 실행하십시오. bash b_script.sh .

출력은 지정된 대로 if 조건만 디버깅합니다.

6. trap 명령을 사용하여 bash 스크립트를 디버그하는 방법:

스크립트가 복잡한 경우 디버깅을 위한 보다 정교한 기술도 있습니다. 그 중 하나는 명령. NS command는 신호를 포착하여 특정 상황이 발생했을 때 명령을 실행합니다. 명령은 신호 또는 기능일 수 있습니다. 라는 이름으로 다른 스크립트를 만들었습니다. sum_script.sh :

#! /bin/bash
'echo '${LINENO} 라인: 첫 번째 숫자는 $number1, 두 번째 숫자는 $number2, 합계는 $sum' '디버그
던졌다 '첫 번째 숫자 입력'
읽다1번
던졌다 '두 번째 숫자 입력'
읽다2 번
합집합= $[숫자1 + 숫자2]
던졌다 ' 합계는$sum'

NS 명령 디버그 신호 표시 변수의 상태 1번 , 2 번 그리고 합집합 다음 출력 이미지와 같이 각 행을 실행한 후:

노란색 블록은 사용자가 아직 입력하지 않았기 때문에 공백입니다. 이 공백은 사용자가 값을 입력하면 채워집니다. 이 방법은 bash 스크립트 디버깅에도 매우 유용합니다.

7. -f 옵션을 사용하여 파일 글로빙을 제거하여 bash 스크립트를 디버그하는 방법:

파일 글로빙은 와일드카드 문자가 있는 파일을 찾는 프로세스입니다. * 그리고 ? . 많은 상황에서 디버깅하는 동안 파일을 확장할 필요가 없습니다. 이러한 경우 다음을 사용하여 파일 글로빙을 차단할 수 있습니다. -NS 옵션. 스크립트로 이해하자 fglobe_script.sh :

#! /bin/bash
던졌다 '모든 텍스트 파일을 표시합니다.'
*.txt

위의 코드는 현재 디렉토리의 모든 텍스트 파일을 표시하고 다음을 실행합니다.

$세게 때리다fglobe_script.sh

파일 글로빙을 끄려면 다음을 사용하십시오. -NS 옵션:

$세게 때리다 -NSfglobe_script.sh

마찬가지로 shebang과 함께 사용할 수 있습니다. 세트 명령도:

#! /bin/bash
던졌다 '모든 텍스트 파일을 표시합니다.'
*.txt
세트 -NS
던졌다 '모든 텍스트 파일 표시'
*.txt
세트+에프

이제 실행 bash fglobe_script.sh:

로 동봉된 부분 세트 -f/세트 +f 옵션이 와일드카드 문자가 있는 명령을 처리하지 않았습니다.

8. 셸 스크립트를 디버그하기 위해 디버깅 옵션을 결합하는 방법:

우리는 위에서 언급한 디버깅 기술에서 하나의 옵션만 사용하지만 더 나은 이해를 위해 다양한 옵션을 결합할 수 있습니다. 구현하자 -NS 그리고 -V 옵션 sum_script.sh 스크립트. 나는 사용하고있다 sum_script.sh 스크립트.

#! /bin/bash
던졌다 '첫 번째 숫자 입력'
읽다1번
던졌다 '두 번째 숫자 입력'
읽다2 번
합집합= $[숫자1 + 숫자2]
던졌다 ' 합계는$sum'

이제 다음을 실행합니다.

$세게 때리다 -xvsum_script.sh

둘 다 -NS 그리고 -V 출력 이미지에 표시된 대로 출력이 결합됩니다. 유사하게, 우리는 또한 결합할 수 있습니다 -유 오류 감지를 위해 verbose -v 옵션이 있습니다. 나는 교체하고있다 1번 변수 하나에 스크립트의 여섯 번째 줄에서:

#! /bin/bash
~이다$숫자2그리고합집합~이다$sum' ' 디버그
던졌다 '
첫 번째 숫자를 입력하세요'
읽기 번호 1
던졌다 '
두 번째 숫자 입력'
2번 읽기
합계=$[숫자 + 숫자2]
던졌다 '
NS합집합~이다$sum'

출력을 보려면 아래 언급된 명령을 실행하십시오.

$세게 때리다 -UVsum_script.sh

9. 디버그 보고서를 파일로 리디렉션하는 방법:

bash 스크립트의 디버그 보고서를 파일에 저장하는 것은 많은 상황에서 편리할 수 있습니다. 디버그 보고서를 파일로 리디렉션하기 때문에 약간 까다롭습니다. 우리는 몇 가지 특별한 변수를 사용합니다. 에 구현해보자 b_script.sh 암호:

#! /bin/bash
간부 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
던졌다 '1번 입력'
읽다1번
던졌다 '2번 입력'
읽다2 번
만약 [ '$숫자' -gt '$숫자2' ]
그 다음에
던졌다 '숫자1이 숫자2보다 큽니다'
엘리프 [ '$숫자1' -eq '$숫자2' ]
그 다음에
던졌다 '1번은 2번과 같다'
또 다른
던졌다 '숫자2가 숫자1보다 큽니다'
~이다

코드의 두 번째 줄에서 출력을 다음으로 리디렉션하고 있음을 알 수 있습니다. debug_report.log 파일을 사용하여 간부 파일 설명자 5(FD5)가 있는 명령.

exec 5> debug_report.log: NS 간부 명령은 셸에서 발생하는 모든 것을 파일로 리디렉션합니다. debug_report.log.

BASH_XTRACEFD=5: 이것은 특정 bash 변수 다른 쉘에서는 사용할 수 없습니다. 유효한 파일 설명자를 할당해야 하며 bash는 추출된 출력을 다음에 기록합니다. debug_report.log.

PS4='$LINENO– ': xtrace 모드를 사용하여 디버깅하는 동안 줄 번호를 인쇄하는 데 사용되는 bash 변수이기도 합니다. PS4의 기본값은 + 징후

위의 스크립트는 debug_report.log, 그것을 읽으려면 사용 고양이 명령:

결론:

버그가 가득한 코드는 프로그램의 성능에 영향을 미치고 하드웨어에도 해로울 수 있습니다. 디버깅은 프로그램을 보다 효율적으로 만들기 때문에 모든 프로그램에서 매우 중요합니다. 프로그램 개발 중에 기존 오류와 잠재적 오류를 찾으면 프로그램이 예기치 않게 작동하는 것을 방지할 수 있습니다. 큰 코드는 일반적으로 활성 디버깅이 필요하며, 코드 덩어리를 소비하는 리소스를 제거하여 코드의 효율성을 향상시킵니다.

많은 프로그래밍 언어와 환경에는 자체 컴패니언 디버거가 있습니다. bash 스크립팅에서 다양한 기술을 구현하여 스크립트를 디버그할 수 있습니다. 이 가이드는 bash 스크립트에서 버그를 찾는 데 사용할 수 있는 모든 방법에 집중했습니다. 따라서 bash 스크립트가 예상대로 작동하지 않는다고 느낄 때마다 위에서 언급한 기술을 사용하지만 xtrace 모드(-x)는 대부분의 경우에 매우 유용합니다.