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
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";
결과 유형 :
log4sh
휴대용이 더 필요한 제품이 필요한 경우 이전의 log4sh
도 있습니다. log4bash
, 여기에서 사용 가능 :
댓글
- Ubuntu에서는 .bashrc에 iv id =를 모방 한
alias say="spd-say"
가 있습니다. “3874c79e76”>
명령은 다른 배포판이나 OS X에서 제공합니다.
답변
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의 결합 된 환경을 사용할 수 있습니다.
- Eclipse Shelled Plug-in :
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash 디버거-셸드에서만 작동합니다.
http://sourceforge.net/projects/basheclipse/
셸 전환
기본적으로 Shelled 개발 도구는 /bin/dash
를 인터프리터로 사용합니다. 웹 및 내 환경에있는 대부분의 셸 예제와 더 잘 호환되도록 /bin/bash
로 변경했습니다.
참고 : 다음으로 이동하여이를 변경할 수 있습니다. 창 -> 환경 설정 -> 셸 스크립트 -> 통역사
설정 지침
디버거 패키지에는 기본적으로 (readme.txt) 스크립트 디버깅을위한 _DEBUG.sh
스크립트를 사용하는 단계가 있습니다.
- 셸 스크립트 프로젝트 만들기 : 파일 -> 신규 -> 기타 – > 셸 스크립트
-> 셸 스크립트 프로젝트 마법사 .
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 “및 각 변수의 값도 표시합니다.
댓글
- 이 답변은 올바른 맥락에서 질문을 다루지 않습니다. IDE가 언급되지 않았기 때문에 명령 줄 가정
답변
간단히 사용 :
#!/bin/bash -x
셸의 경우 동일 :
#!/bin/sh -x
BASH_XTRACEFD="5"
를 사용하는 경우 bash는set -x
가 파일 설명자 5.exec 5> >(logger -t $0)
는 파일 설명자 5의 출력을logger
명령.