スクリプトの失敗の原因となった失敗したコマンドをどのように印刷できますか?

スクリプトの失敗の原因となった失敗したコマンドをどのように印刷できますか?

フラグを使用しています-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スクリプトに追加し、出力の最後の数行を見てください。出力全体を読み取る必要はありません。

関連情報