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

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

오류 및 예상치 못한 동작과 관련된 bash의 일부 스크립트에 몇 가지 문제가 있습니다. 문제의 원인을 조사하여 수정 사항을 적용하고 싶습니다. Bash에서 더 많은 정보를 얻기 위해 일종의 "디버그 모드"를 활성화하는 방법이 있습니까?

답변1

다음 명령을 사용하여 bash 스크립트를 시작 bash -x ./script.sh하거나 스크립트에 추가하여 set -x디버그 출력을 확인하세요.


bash버전 4.1 이상의 추가 기능:

디버그 출력을 별도의 파일에 쓰려면 다음을 스크립트에 추가하세요.

exec 5> debug_output.txt
BASH_XTRACEFD="5"

바라보다:https://stackoverflow.com/a/25593226/3776858


줄 번호를 보려면 다음을 추가하세요.

PS4='$LINENO: '


logger명령에 대한 액세스 권한이 있는 경우 이를 사용하여 타임스탬프, 스크립트 이름 및 줄 번호를 포함하여 시스템 로그를 통해 디버그 출력을 작성할 수 있습니다.

#!/bin/bash

exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
PS4='$LINENO: '
set -x

# Place your code here

-p명령 옵션을 사용하여 개별 시설 및 수준을 설정 logger하고 로컬 시스템 로그를 통해 자체 로그 파일에 출력을 쓸 수 있습니다.

답변2

사용set -x

나는 항상 set -x및 를 사용합니다 set +x. 무슨 일이 일어나고 있는지 확인하려는 영역을 래핑하여 세부 수준을 높이거나 낮출 수 있습니다.

#!/bin/bash

set -x
..code to debug...
set +x

log4bash

또한, 개발 작업을 해본 적이 있고 log4j, log4perl 등의 로거 스타일에 익숙하다면 다음을 사용하는 것이 좋습니다.log4bash.

발췌

현실을 직시하자 - 평범하고 오래된 Echo는 그것을 자르지 않을 것입니다. log4bash는 Bash 스크립트에 더 나은 로깅을 제공하기 위한 시도입니다(즉, Bash에서 더 적은 로깅).

여기에서 Bash 스크립트로 다음을 수행할 수 있습니다.

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

다음 유형의 출력을 생성합니다.

    SS1

log4sh

더 이식성이 뛰어난 것이 필요한 경우 log4sh다음과 유사한 이전 버전이 있습니다 log4bash.

답변3

bash 디버거가 있습니다.배쉬 데이터베이스, 이는 많은 배포판에 설치 가능한 패키지입니다. Bash에 내장된 확장 디버깅 모드( shopt -s extdebug)를 사용합니다. 다음은 참조용 샘플 세션입니다.

$ ls
1st.JPG  2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
  newf=${f/JPG/jpg}
  mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1:      for f in *.JPG
bashdb<0> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4:        mv $f $newf

gdb에서와 마찬가지로 이 명령문은 다음과 같은 내용만 표시합니다.앞으로곧 실행될 예정입니다. 따라서 명령문이 실행되기 전에 변수를 확인하여 명령문이 수행할 작업을 알 수 있습니다.

bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1:      for f in *.JPG
bashdb<4> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4:        mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG

이것은 우리가 원하는 것이 아닙니다! 매개변수 확장에 대해 다시 살펴보겠습니다.

bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg

좋아요, 작동합니다. newf올바른 값으로 설정해 보겠습니다 .

bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg

좋아 보인다. 스크립트를 계속 진행하세요.

bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg  2ndJPG.jpg

답변4

이클립스 사용

아래 링크된 "_DEBUG.sh" 스크립트를 사용하면 Eclipse와 Shelled의 결합된 환경을 사용할 수 있습니다.

스위치 쉘

기본적으로 Shelled 개발 도구는 /bin/dash인터프리터로 사용됩니다. /bin/bash웹과 내 환경에 있는 대부분의 쉘 예제와 더 나은 호환성을 갖도록 변경했습니다 .

노트:다음과 같은 방법으로 이 설정을 변경할 수 있습니다.창문->선호->쉘 스크립트->통역사

설정 지침

디버거 패키지에는 _DEBUG.sh기본적으로 scripts를 사용하여 스크립트 디버깅을 위한 단계가 포함되어 있습니다(readme.txt).

  1. 셸 스크립트 프로젝트를 만듭니다. 문서->새로운->다른->쉘 스크립트->쉘 스크립트 프로젝트 마법사.
  2. Bash 스크립트 파일을 만듭니다.문서->새로운->문서. 이 예에서는 script.sh확장자가 ".sh"여야 하며 필수입니다.
  3. 파일을 _DEBUG.sh프로젝트 폴더에 복사합니다.
  4. 파일 상단에 다음 텍스트를 삽입합니다 script.sh.

    . _DEBUG.sh
    
  5. 파일이 Microsoft Windows에서 생성된 경우 반드시 다음을 실행하십시오.문서->줄 구분 기호를 다음으로 변환->유닉스.

  6. 디버그 시작 구성을 설정합니다.달리기->디버그 구성->배쉬 스크립트...설정해야 할 필드는 2개입니다.

    a) "Bash 스크립트:" - 디버깅할 Bash 스크립트에 대한 Eclipse 작업공간의 경로입니다.
    e) "디버거 포트:" 33333

  7. "디버그" 관점으로 전환하십시오. 디버깅 세션을 시작합니다. script.shbash 쉘에서 실행하십시오.

Bash 디버깅 사용자 인터페이스

여기에 이미지 설명을 입력하세요.

배시 디버거다음과 같은 표준 프로그래밍 디버거의 모든 기능을 갖추고 있습니다.

  • 중단점 전환
  • 단일 단계 작동
  • 함수와 서브루틴을 단계별로 실행, 단계적으로 실행
  • 스크립트가 실행되는 동안 언제든지 코드나 변수를 확인하세요.

껍질을 벗긴(쉘 스크립트 편집기) IDE(통합 개발 환경)에는 스크립트를 작성하는 동안 컨텍스트 확인, 강조 표시 및 들여쓰기를 수행하는 추가 이점이 있습니다. 들여쓰기가 올바르지 않으면 즉시 많은 버그를 표시/지역화할 수 있습니다.

그리고 거기에는기타 IDE 장점예를 들어:

  • TODO 작업 목록
  • 마이린 미션
  • 북마크 목록
  • 다중 창 편집
  • 원격 공유 환경

관련 정보