bash 中最后一个失败的命令

Eim*_*tas 10 shell scripting bash environment-variables

$?变量保存上次运行命令的退出状态。是否有一个变量可以保存上次运行命令本身?

roz*_*acz 7

如果最后一个命令在没有参数的情况下执行,它将保存在$_变量中。这通常包含一个命令的最后一个参数- 所以如果没有参数,则值$_是最后一个命令本身。

另一种选择是了解上一个后台命令的详细信息。正如 l0b0 所写,$!保存它的 PID - 这样你就可以解析输出ps $!(可能有额外的格式化选项ps)。


jan*_*sen 7

使用fc获得前一个命令行。它通常用于在您喜欢的编辑器中编辑上一个命令行,但它也有一个“列表”模式:

last_command="$(fc -nl -1)"


Gil*_*il' 6

DEBUG陷阱允许您在执行任何简单命令之前执行命令。变量中提供了要执行的命令的字符串版本(单词之间用空格分隔)BASH_COMMAND

\n\n
trap \'previous_command=$this_command; this_command=$BASH_COMMAND\' DEBUG\n\xe2\x80\xa6\necho "last command is $previous_command"\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,previous_command每次运行命令时都会发生变化,因此将其保存到变量中以便使用它。如果您还想知道上一个命令的返回状态,请将两者保存在一个命令中。

\n\n
cmd=$previous_command ret=$?\nif [ $ret -ne 0 ]; then echo "$cmd failed with error code $ret"; fi\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您只想在失败的命令时中止,请使用set -e使脚本在第一个失败的命令时退出。EXIT您可以显示陷阱中的最后一条命令。

\n\n
set -e\ntrap \'echo "exit $? due to $previous_command"\' EXIT\n
Run Code Online (Sandbox Code Playgroud)\n\n

可能适用于某些用途的另一种方法是set -x打印脚本执行的跟踪并检查跟踪的最后几行。

\n