bash 스크립트를 디버깅하는 방법?


31

에코 및 로깅을 사용하지 않고 bash 스크립트를 디버깅하는 방법이 있습니까?

나는 브레이크 포인트와 그와 같은 것들을 사용하는 것에 대해 이야기하고 있습니다.

답변:



20

몇 가지 다른 방법이 있습니다.

  • -x 옵션으로 스크립트를 실행하십시오.

    bash -x yourscript.sh
  • set -x스크립트 파일의 시작 부분에서 Shebang 이후 #!/bin/bash및 스크립트 시작 전에 새 행을 추가 set -v하면 쉘 입력 행이 set -x표시되고 실행 된 명령 및 인수가 표시됩니다.

  • 스크립트 파일의 shebang을 #!/bin/bash -xv




4

이 작은 기능을 사용하여 "콘솔"에 들어갈 수 있습니다.

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

그런 다음 스크립트 내부 (EXAMPLE)에서

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

로컬 변수를 그대로 유지하면서 모든 명령을 수락합니다. "디버그"모드를 종료하려면 "exit"를 입력하면 (스크립트가 종료되지 않음) 코드가 계속 진행됩니다. 루프 내에서 "디버그"를 사용하면 매번 중지됩니다. 위의 예와 같이 "if"안에 넣거나 "watch"함수를 만들 수 있습니다.

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

또한 사용 가능한 모든 변수와 해당 값을 덤프하는 "vars"명령을 추가했습니다. 사용자 정의 명령을 추가 할 수도 있습니다.

몇 분 안에 코드를 작성 했으므로 자신의 위험에 따라 사용하십시오. 디버그 모드에서는 모든 명령을 실행할 수 있으므로 프로덕션 스크립트에 그대로두면 보안 위험이 있습니다.


3
대문자 변수 이름을 사용하지 마십시오. 특수 쉘 변수 및 환경 변수를 무시할 위험이 있습니다. 또한 결과로 단어 분리 및 경로 이름 확장이 발생하지 않도록 인수로 사용될 때 매개 변수 확장을 인용해야합니다. 예를 들어 * ) eval "$cmd" ;;debug_watch "$file" strange_case.txt.
geirha

geirha가 제안한 코드를 편집했습니다.
lepe

2

NES가 말하는 것을 튜닝하기 위해 bash에는 디버깅을 허용하는 플래그가 설정되어 있습니다.

set -x플래그가 설정 및 해제하거나 터미널에서, 또는 스크립트 내에서 할 수있다. +또는 사용 -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

set명령은 다음과 같습니다 .

  • set -f 메타 문자를 사용하여 파일 이름 생성을 비활성화합니다.
  • set -v 쉘 입력 행을 읽을 때 인쇄합니다 (자세한 내용).
  • set -x 명령을 실행하기 전에 명령 추적을 인쇄하십시오.

set실제로 많은 기능을 가지고 있지만 쉘에 내장 된 도구이므로 맨 페이지가 없습니다. set 매뉴얼 은 GNU Bash 문서에 있습니다.

프로그램에 대한 세부 정보를 얻는 데 도움이되는 수많은 명령 줄 도구가 있습니다.

  • stat 파일 또는 파일 시스템 상태 표시
  • file 파일 형식을 결정하십시오.
  • hexdump 지정된 파일을 다양한 형식으로 표시하는 필터
  • nohup 멈추지 않는 스크립트를 실행

    그리고 다른 많은. 숨겨진 문자를 보여주는 명령을 생각하고 있었지만 지금은 할 수 없습니다. Hexdump가 그렇게하지만 더 나은 것이 있습니다.

키 명령 ctrl\으로 실행중인 프로그램 또는 스크립트가 코어 덤프됩니다. 그런 다음 코어 덤프를 분석 할 수 있습니다. 아마도 gdb를 사용하여 코어 덤프를 분석 할 것이지만 많은 프로그램이 존재합니다.

bash 쉘에는 디버깅을위한 멋진 옵션이 있습니다. options --debugger, -vverbose --dump-strings및 기타 유용한 옵션이 있습니다. 를 사용하여 확인하십시오 man bash.

trap명령 (내장 쉘은) 당신을 위해 매우 도움이 될 수 있습니다. 트랩은 프로그램이 예기치 않게 종료되면 무언가를 실행한다고 말합니다. 트랩 및 기타 편리한 Bash Shell 내장에 대한 내용은 여기를 참조하십시오 .

일반적으로 말하면, 디버깅은 모든 언어에서 큰 주제입니다. 프로그래밍 언어로 디버깅하는 데 유용한 다른 주제로는 쉘 재 지정 및 신호 처리가 있습니다.

마지막으로, 내가 사용한 예제는 사소한 것이지만 일부 셸 스크립트는 수백 줄이 될 수 있습니다. 이러한 상황에서는 주석 태그를 삽입하고 결함이 의심되는 코드를 차단하거나 종료 명령을 삽입하고 나누기 및 정복 기술을 사용하여 기능 코드를 손상된 코드에서 격리하려고합니다.


1

bash 스크립트를 디버깅하기위한 GUI 옵션은 BashEclipse / Shelled 플러그인이있는 Eclipse IDE입니다.

breakpoints and stuff복잡한 bash 스크립트를 디버깅하기위한 다양한 기능과 함께 질문 기능 ( )을 제공합니다.

일부 기능에는 다음이 포함됩니다
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • 중단 점 토글
  • 단일 단계별 작업
  • 스텝 인, 스텝 아웃, 스텝 오버 기능 및 서브 루틴
  • 스크립트가 실행되는 동안 언제든지 코드 변수 검사
  • TODO 작업 목록
  • 북마크 목록
  • 다중 창 편집
  • 프로젝트 환경의 원격 공유

스크립트 편집기 퍼스펙티브 : 이클립스 스크립트 IDE

디버깅 관점 : 이클립스 스크립트 디버그 관점

사용 단계는 일식에 플러그인 ShelledBashEclipse플러그인을 추가하는 것 입니다. 그런 다음 BashEclipse read me 텍스트 파일에 제공된 프로 시저를 실행하여 디버거를 시작하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.