我正在使用-e
旗帜。
用法:
#!/bin/bash -e
解释:
-e Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a non-zero status
当脚本中的某个命令失败时,脚本退出并且不会继续执行其余命令,这正是我想要的。
但是,失败仅包含失败命令选择公开的信息。
有时失败的命令非常复杂,例如带有许多标头的卷曲。
如何打印失败的命令?我的意思是,在失败后立即。
我知道我可以使用-x
bash 标志,但它会打印所有已执行的命令。我只想看看失败的那个。
答案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
到脚本中,然后查看输出的最后几行。您不必阅读整个输出。