[linux] bash 스크립트를 실행할 때 줄 번호를 표시하는 방법

나는 명령을 많이 가지고 테스트 스크립트가 출력을 많이 생성, 내가 사용 set -x하거나 set -vset -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/debuggingtipsPS4추적에 필요한 모든 것을 출력 하는 궁극기 를 제공합니다 .

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 "$@"

Bash 변수에 대한 자세한 내용은 여기 를 참조 하십시오 .


답변

간단하지만 강력한 솔루션 : echo문제를 일으키는 것으로 생각되는 코드 주위 echo에 배치하고 메시지가 더 이상 화면에 나타나지 않을 때까지 한 줄씩 이동합니다 . 이전에 오류로 인해 스크립트가 중지 되었기 때문입니다.

더욱 강력한 솔루션 : bashdbbash 디버거를 설치 하고 스크립트를 한 줄씩 디버그합니다.


답변

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.

더 추가 할 사항이 있습니까?

확실한. 왜 이것이 필요합니까? 이것으로 어떻게 작업합니까? 이것으로 무엇을 할 수 있습니까? 이 간단한 접근 방식이 정말 충분하거나 유용합니까? 왜 이것으로 땜질하고 싶습니까?

더 알고 싶으세요? 디버깅에 대한 고찰 읽기


답변