나는 명령을 많이 가지고 테스트 스크립트가 출력을 많이 생성, 내가 사용 set -x
하거나 set -v
및 set -e
오류가 발생하면 스크립트가 중지 것, 그래서. 그러나 문제를 찾기 위해 실행이 중단 된 줄을 찾는 것은 여전히 다소 어렵습니다. 각 라인이 실행되기 전에 스크립트의 라인 번호를 출력 할 수있는 방법이 있습니까? 또는에 의해 생성 된 명령 전시 전에 줄 번호를 출력하십시오 set -x
. 또는 스크립트 줄 위치 문제를 처리 할 수있는 모든 방법이 큰 도움이 될 것입니다. 감사.
답변
이미를 사용하고 있다고 언급했습니다 -x
. 변수 PS4
는 -x
옵션이 설정되고 기본값 :
은 공백 이 뒤 따르는 경우 명령 줄이 에코되기 전에 인쇄되는 프롬프트임을 나타냅니다 .
(현재 실행중인 스크립트 또는 셸 함수의 줄 번호) PS4
를 내보내도록 변경할 수 있습니다 LINENO
.
예를 들어 스크립트가 다음과 같은 경우
$ cat script
foo=10
echo ${foo}
echo $((2 + 2))
따라서 실행하면 줄 번호가 인쇄됩니다.
$ PS4='Line ${LINENO}: ' bash -x script
Line 1: foo=10
Line 2: echo 10
10
Line 3: echo 4
4
http://wiki.bash-hackers.org/scripting/debuggingtips 는 PS4
추적에 필요한 모든 것을 출력 하는 궁극기 를 제공합니다 .
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
답변
Bash $LINENO
에서 스크립트가 현재 실행중인 줄 번호를 포함합니다.
함수가 호출 된 줄 번호를 알아야하는 경우을 시도하십시오 $BASH_LINENO
. 이 변수는 배열입니다.
예를 들면 :
#!/bin/bash
function log() {
echo "LINENO: ${LINENO}"
echo "BASH_LINENO: ${BASH_LINENO[*]}"
}
function foo() {
log "$@"
}
foo "$@"
답변
간단하지만 강력한 솔루션 : echo
문제를 일으키는 것으로 생각되는 코드 주위 echo
에 배치하고 메시지가 더 이상 화면에 나타나지 않을 때까지 한 줄씩 이동합니다 . 이전에 오류로 인해 스크립트가 중지 되었기 때문입니다.
더욱 강력한 솔루션 : bashdb
bash 디버거를 설치 하고 스크립트를 한 줄씩 디버그합니다.
답변
LINENO가없는 쉘에 대한 해결 방법
상당히 정교한 스크립트에서는 모든 줄 번호를보고 싶지 않습니다. 오히려 출력을 제어하고 싶습니다.
함수 정의
echo_line_no () {
grep -n "$1" $0 | sed "s/echo_line_no//"
# grep the line(s) containing input $1 with line numbers
# replace the function name with nothing
} # echo_line_no
다음과 같은 따옴표와 함께 사용하십시오.
echo_line_no "this is a simple comment with a line number"
출력은
16 "this is a simple comment with a line number"
소스 파일에서이 행의 수가 16 인 경우.
이것은 기본적으로 ash 또는 다른 셸 사용자를 위해 bash 스크립트 를 실행할 때 줄 번호를 표시하는 방법 이라는 질문에 답합니다 LINENO
.
더 추가 할 사항이 있습니까?
확실한. 왜 이것이 필요합니까? 이것으로 어떻게 작업합니까? 이것으로 무엇을 할 수 있습니까? 이 간단한 접근 방식이 정말 충분하거나 유용합니까? 왜 이것으로 땜질하고 싶습니까?
더 알고 싶으세요? 디버깅에 대한 고찰 읽기