返回 shell 脚本中执行的最后一个命令

返回 shell 脚本中执行的最后一个命令

在 bash 脚本中,我想检索最后执行的命令。在 bash 中,以下命令非常有用。

lastCommand=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')

然而,脚本内部的历史记录根本不起作用。

有没有办法检索脚本内的命令?

答案1

对于 bash v4+ :

在 shell 中使用交互模式。

将 she-bang 设置为

#!/bin/bash -i

并且history你的脚本内部将会起作用。

 $ cat test.sh
#!/bin/bash
history | wc -l
 $ ./test.sh
0
 $ sed -i '1s/bash/bash -i/' test.sh
 $ ./test.sh
6495

脚本内部执行的命令不会记录到历史记录中。

对于 bash v3(可能也适用于较旧的版本)

  • 上述方法不适用于此版本的 bash。但是,您可以完全删除 she-bang,历史记录将正常工作。此方法也适用于 bash v4。

  • 将 she-bang 设置为交互式的,并且不要忘记set -o historychepner 所提到的。

#!/bin/bash -i
set -o history

PS.history |tail -n2 |head -n1不等于最后一个命令。它是最后一个命令之前的命令。

请注意,如果 last 或 prelast 命令是多行,它将不会返回正确的结果。

顺便说一下,在控制台中您可以用来!-2引用 prelast 命令,而不是使用奇怪的构造。不幸的是,即使在交互模式下,它似乎在 shell 脚本中也不起作用。

答案2

这有帮助吗?

lastCommand=$(`cat ~/.bash_history |tail -n2 |head -n1` | sed 's/[0-9]* //')

或者可能是这样:

echo !!

由于 bash 具有内置设施来提供最后的命令

相关内容