스크립트 실패의 원인이 된 실패한 명령을 어떻게 인쇄할 수 있나요?

스크립트 실패의 원인이 된 실패한 명령을 어떻게 인쇄할 수 있나요?

플래그를 사용하고 있습니다 -e.

용법:

#!/bin/bash -e

설명하다:

-e      Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a non-zero status

스크립트의 명령이 실패하면 스크립트가 종료되고 내가 원하는 나머지 명령이 계속 실행되지 않습니다.

그러나 실패에는 실패한 명령 선택으로 노출된 정보만 포함됩니다.

때로는 헤더가 많은 컬과 같이 실패하는 명령이 매우 복잡할 때도 있습니다.

실패한 명령을 인쇄하는 방법은 무엇입니까? 즉, 실패 직후입니다.

-xbash 플래그를 사용할 수 있다는 것을 알고 있지만 실행된 모든 명령이 인쇄됩니다. 나는 단지 실패한 사람을 보고 싶을 뿐이다.

답변1

trapa를 사용하여 실패한 명령(및 해당 줄 번호)을 식별 할 수 있습니다 . 이것은 예이다

#!/bin/bash -e
# This script can be used to fail intentionally and exit

# Declare an error handler
trapERR() {
    ss=$? bc="$BASH_COMMAND" ln="$BASH_LINENO"
    echo ">> Failing command is '$bc' on line $ln and status is $ss <<" >&2
    exit $ss
}

# Arrange to call trapERR when an error is raised
trap trapERR ERR    

# Start here
date
echo 'hello, world'
#sleep rt    # Remove the leading comment to 
echo 'all done'
exit 0

성공적으로 완료되었습니다:

23 Jan 2023 15:58:03
hello, world
all done

sleep오류 발생을 방지하려면 이전 주석을 삭제하세요.

23 Jan 2023 15:58:34
hello, world
sleep: invalid time interval ‘rt’
Try 'sleep --help' for more information.
>> Failing command is 'sleep rt' on line 12 and status is 1 <<

답변2

실패한 명령을 찾아 set -x앞에 추가한 후 스크립트를 다시 실행하세요.

어떤 명령이 실패했는지 모르는 경우 - 명령 사이에 추가 echo 1등 을 echo 2하면 오류가 발생한 위치를 알려줍니다.

-x스크립트에 추가 하고 출력의 마지막 몇 줄을 살펴보세요. 전체 출력을 읽을 필요는 없습니다.

관련 정보