在 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 history
chepner 所提到的。
#!/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 具有内置设施来提供最后的命令