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

Bash의 일부 스크립트에 오류 및 예상치 못한 동작에 대한 문제가 있습니다. 문제의 원인을 조사하여 신청할 수 있습니다. 더 많은 정보를 얻기 위해 bash의 “디버그 모드”를 전환 할 수있는 방법이 있습니까?

답변

bash -x ./script.sh로 bash 스크립트를 시작하거나 스크립트 set -x를 추가하여 디버그 출력을 확인하세요.


bash 4.1 이상에 추가 :

디버그 출력을 별도의 파일에 작성하려면 다음을 스크립트에 추가하십시오.

exec 5> debug_output.txt BASH_XTRACEFD="5" 

참조 : https://stackoverflow.com/a/25593226/3776858


줄 번호를 보려면 다음을 추가하십시오.

PS4="$LINENO: " 


명령을 사용하면 타임 스탬프, 스크립트 이름 및 줄 번호와 함께 syslog를 통해 디버그 출력을 작성할 수 있습니다.

#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here 

logger 명령의 -p 옵션을 사용하여 개별 시설 및 수준을 설정할 수 있습니다. 로컬 syslog를 통해 자체 로그 파일에 출력을 기록합니다.

Comments

  • -v도 도움이 될 수 있습니다 (실행될 때 각 줄을 인쇄합니다. -x와 함께 사용할 수 있습니다.) 또한 다음을 참조하십시오. bashdb.sourceforge.net
  • 또 다른 멋진 리소스 : shellcheck .net
  • ” exec 5 > ” do?
  • @aggsol : BASH_XTRACEFD="5"를 사용하는 경우 bash는 set -x 파일 설명자 5. exec 5> >(logger -t $0)는 파일 설명자 5의 출력을 logger 명령.
  • PS4에서 줄 번호와 셸 스크립트 경로 또는 이름을 얻을 수 있는지 궁금하십니까?

Answer

set -x

사용

항상 set -x 및 . 자세한 정보를 높이거나 낮추기 위해 어떤 일이 발생하는지 확인하려는 영역을 래핑 할 수 있습니다.

#!/bin/bash set -x ..code to debug... set +x 

log4bash

또한 개발 작업을 마쳤고 log4j, log4perl 등의 이름을 사용하는 로거 스타일에 익숙하다면 log4bash 를 사용하는 것이 좋습니다. a>.

발췌

직면하자-평범한 오래된 에코는 잘리지 않습니다. 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, 여기에서 사용 가능 :

댓글

  • Ubuntu에서는 .bashrc에 iv id =를 모방 한 alias say="spd-say"가 있습니다. “3874c79e76”>

명령은 다른 배포판이나 OS X에서 제공합니다.

  • set -vx는 트랩-트랩 읽기 디버그와 함께 사용하는 경우 좋은 조합입니다. 이렇게하면 한 줄씩 건너 뛸 수 있습니다. 결과보기
  • 답변

    bash 디버거, bashdb가 있습니다. 는 많은 배포판에 설치 가능한 패키지입니다. bash “의 내장 확장 디버깅 모드 (shopt -s extdebug)를 사용합니다. gdb와 매우 유사합니다. 여기에 약간의 맛을 제공하는 샘플 세션이 있습니다.

    $ 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 

    Answer

    다음과 같은 대부분의 Bourne 기반 셸에서 스크립트를 디버깅하는 표준 방법 bash는 스크립트 상단에 set -x를 작성하는 것입니다. 이렇게하면 bash가 수행 / 실행되는 작업과 인수 평가 방법에 대해 더 자세한 정보를 얻을 수 있습니다.

    -x Print commands and their arguments as they are executed. 

    이것은 인터프리터 또는 내부 스크립트에 유용합니다. 예 :

    $ find "$fileloc" -type f -prune "$filename" -print + find /var/adm/logs/morelogs -type f -prune "-name *.user" -print find: unknown predicate "-name *.user" $ find "$fileloc" -type f -prune $filename -print + find /var/adm/logs/morelogs -type f -prune -name "*.user" -print find: "/var/adm/logs/morelogs": No such file or directory 

    위에서 작은 따옴표로 인해 찾기가 실패한 이유를 알 수 있습니다.

    기능을 비활성화하려면 set +x를 입력하세요.

    답변

    Eclipse 사용

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

    셸 전환

    기본적으로 Shelled 개발 도구는 /bin/dash를 인터프리터로 사용합니다. 웹 및 내 환경에있는 대부분의 셸 예제와 더 잘 호환되도록 /bin/bash로 변경했습니다.

    참고 : 다음으로 이동하여이를 변경할 수 있습니다. -> 환경 설정 -> 셸 스크립트 -> 통역사

    설정 지침

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

    1. 셸 스크립트 프로젝트 만들기 : 파일 -> 신규 -> 기타 – > 셸 스크립트

    -> 셸 스크립트 프로젝트 마법사 .

  • Bash 스크립트 파일 만들기 : 파일 -> 신규 -> 파일 . 이 예에서는 script.sh입니다. 확장자는 “.sh”여야하며 필수입니다.
  • _DEBUG.sh 파일을 프로젝트 폴더에 복사합니다.
  • 파일 맨 위에 다음 텍스트 script.sh :

    . _DEBUG.sh 
  • 파일이 Microsoft Windows에서 생성 된 다음 파일 -> 행 구분자를 -> Unix 로 변환 .

  • 디버그 시작 구성 설정 : 실행 -> 디버그 구성 -> 배시 스크립트 … 여기에 2 개의 필드를 설정할 수 있습니다.

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

  • 디버그 관점으로 전환합니다. 디버깅 세션을 시작하십시오. bash 셸에서 script.sh를 실행합니다.

  • bash 디버그 UI

    여기에 이미지 설명 입력

    이 bash 디버거 에는 다음과 같은 표준 프로그래밍 디버거의 모든 기능이 있습니다.

    • 중단 점 토글
    • 단일 단계별 작업
    • 스텝 인, 스텝 아웃, 스텝 오버 기능 및 하위 루틴
    • 스크립트가 실행되는 동안 언제든지 코드 또는 변수 검사

    셸드 (셸 스크립트 편집기) IDE (통합 개발 환경)에는 스크립트를 작성하는 동안 컨텍스트 확인, 강조 표시 및 들여 쓰기를 수행하는 추가 보너스가 있습니다. 올바르게 들여 쓰기가되지 않으면 즉시 많은 오류를 플래그 / 로컬로 표시 할 수 있습니다.

    그런 다음 다른 IDE 이점 예 :

    • 할 일 목록
    • Mylyn 작업
    • 북마크 목록
    • 여러 창 편집
    • 환경 원격 공유

    댓글

    • 멋진 팁. Bash가 이렇게 디버깅 할 수 있습니다.

    답변

    최근 몇 년 동안 멋진 리소스가 나타났습니다. http://shellcheck.net

    일반 bash보다 더 많은 것을 보여 주므로 성가신 닫히지 않은 따옴표 또는 곱슬 곱슬 한 따옴표를 쉽게 찾을 수 있습니다. 대괄호 등입니다.

    네트워크를 통해 민감한 정보 (ips, 암호 등)를 붙여 넣지 마십시오. (특히 http이므로 암호화되지 않음) (쉘 체크도 사용할 수 있다고 생각합니다. 다운로드 할 수 있지만 잘 모르겠습니다.)

    답변

    요즘에는 VS Code Bash Debug가 있습니다.

    https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

    Step in / out / over “및 각 변수의 값도 표시합니다.

    VS Code Bash 디버그 스크린 샷

    댓글

    • 이 답변은 올바른 맥락에서 질문을 다루지 않습니다. IDE가 언급되지 않았기 때문에 명령 줄 가정

    답변

    간단히 사용 :

    #!/bin/bash -x 

    셸의 경우 동일 :

    #!/bin/sh -x 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다