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


89

나는 명령을 많이 가지고 테스트 스크립트가 출력을 많이 생성, 내가 사용 set -x하거나 set -vset -e오류가 발생하면 스크립트가 중지 것, 그래서. 그러나 문제를 찾기 위해 실행이 중단 된 줄을 찾는 것은 여전히 ​​다소 어렵습니다. 각 라인이 실행되기 전에 스크립트의 라인 번호를 출력 할 수있는 방법이 있습니까? 또는에 의해 생성 된 명령 전시 전에 줄 번호를 출력하십시오 set -x. 또는 스크립트 줄 위치 문제를 처리 할 수있는 모든 방법이 큰 도움이 될 것입니다. 감사.

답변:


159

이미를 사용하고 있다고 언급했습니다 -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]}(): }'

4
"쉘 스크립트를 디버그하는 방법"에 대해 아무도 언급하지 않는 이유가 궁금합니다. . 이것은 단순한 것보다 훨씬 낫습니다echo
Suvarna Pattayil 2014 년

@VusP 동의, 불필요한 echo진술은 피하는 것이 가장 좋습니다.
devnull

2
나는 도울 수 없지만 그것이 줄 번호를 인쇄 -x 해야한다고 생각합니다 . 또는- 줄 번호를 포함 nx 해야 합니다. 나를 위해, 그 "WTF"순간 중 하나 ...
jww

1
남자, 나는 그것은 나에게 많은 두통을 저장 한 것 ... 난 그 PS4 혼성 빨리에 대해 알고 싶어
niken

2
\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'일부 색상
ULYSSE BN

34

Bash $LINENO에서 스크립트가 현재 실행중인 줄 번호를 포함합니다.

함수가 호출 된 줄 번호를 알아야하는 경우을 시도하십시오 $BASH_LINENO. 이 변수는 배열입니다.

예를 들면 :

#!/bin/bash       

function log() {
    echo "LINENO: ${LINENO}"
    echo "BASH_LINENO: ${BASH_LINENO[*]}"
}

function foo() {
    log "$@"
}

foo "$@"

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


0

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

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


2
echo많은 경우에 도움이 될 수 있지만 의미 있고 구문 분석 가능한 출력이있는 함수에 적용하려고하면 부족합니다.
Eliran Malka

1
@EliranMalka 페어 포인트. 이 경우 stderr로 에코 할 수 있습니다.echo "foo" >&2
hek2mgl

1
... 목적이 본질적으로 진단적인 메시지 인 경우 모든 경우 에 stderr에 에코해야합니다 .
Charles Duffy

0

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.

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

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

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

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