오류 및 예상치 못한 동작과 관련된 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";
다음 유형의 출력을 생성합니다.
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의 결합된 환경을 사용할 수 있습니다.
- Eclipse 셸 플러그인:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash 디버거 - 셸 전용:
http://sourceforge.net/projects/basheclipse/
스위치 쉘
기본적으로 Shelled 개발 도구는 /bin/dash
인터프리터로 사용됩니다. /bin/bash
웹과 내 환경에 있는 대부분의 쉘 예제와 더 나은 호환성을 갖도록 변경했습니다 .
노트:다음과 같은 방법으로 이 설정을 변경할 수 있습니다.창문->선호->쉘 스크립트->통역사
설정 지침
디버거 패키지에는 _DEBUG.sh
기본적으로 scripts를 사용하여 스크립트 디버깅을 위한 단계가 포함되어 있습니다(readme.txt).
- 셸 스크립트 프로젝트를 만듭니다. 문서->새로운->다른->쉘 스크립트->쉘 스크립트 프로젝트 마법사.
- Bash 스크립트 파일을 만듭니다.문서->새로운->문서. 이 예에서는
script.sh
확장자가 ".sh"여야 하며 필수입니다.- 파일을
_DEBUG.sh
프로젝트 폴더에 복사합니다.파일 상단에 다음 텍스트를 삽입합니다
script.sh
.. _DEBUG.sh
파일이 Microsoft Windows에서 생성된 경우 반드시 다음을 실행하십시오.문서->줄 구분 기호를 다음으로 변환->유닉스.
디버그 시작 구성을 설정합니다.달리기->디버그 구성->배쉬 스크립트...설정해야 할 필드는 2개입니다.
a) "Bash 스크립트:" - 디버깅할 Bash 스크립트에 대한 Eclipse 작업공간의 경로입니다.
e) "디버거 포트:" 33333"디버그" 관점으로 전환하십시오. 디버깅 세션을 시작합니다.
script.sh
bash 쉘에서 실행하십시오.
Bash 디버깅 사용자 인터페이스
배시 디버거다음과 같은 표준 프로그래밍 디버거의 모든 기능을 갖추고 있습니다.
- 중단점 전환
- 단일 단계 작동
- 함수와 서브루틴을 단계별로 실행, 단계적으로 실행
- 스크립트가 실행되는 동안 언제든지 코드나 변수를 확인하세요.
껍질을 벗긴(쉘 스크립트 편집기) IDE(통합 개발 환경)에는 스크립트를 작성하는 동안 컨텍스트 확인, 강조 표시 및 들여쓰기를 수행하는 추가 이점이 있습니다. 들여쓰기가 올바르지 않으면 즉시 많은 버그를 표시/지역화할 수 있습니다.
그리고 거기에는기타 IDE 장점예를 들어:
- TODO 작업 목록
- 마이린 미션
- 북마크 목록
- 다중 창 편집
- 원격 공유 환경