如何打印导致脚本失败的失败命令?

如何打印导致脚本失败的失败命令?

我正在使用-e旗帜。

用法:

#!/bin/bash -e

解释:

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

当脚本中的某个命令失败时,脚本退出并且不会继续执行其余命令,这正是我想要的。

但是,失败仅包含失败命令选择公开的信息。

有时失败的命令非常复杂,例如带有许多标头的卷曲。

如何打印失败的命令?我的意思是,在失败后立即。

我知道我可以使用-xbash 标志,但它会打印所有已执行的命令。我只想看看失败的那个。

答案1

您可以使用 atrap来识别失败的命令(及其行号)。这是一个例子

#!/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到脚本中,然后查看输出的最后几行。您不必阅读整个输出。

相关内容