历史记录 - 仅列出成功运行的命令

历史记录 - 仅列出成功运行的命令

我想知道是否有办法使用历史命令但仅列出已成功运行的命令。同样,是否有一种方法可以列出产生错误的错误?

我知道每个命令的退出状态为:

0- 命令执行成功
1- 由于扩展或重定向期间发生错误,命令失败,退出状态大于零。
2- 命令使用不正确
12- 找到命令但不可执行
127- 未找到命令

并可以通过以下命令进行检查echo $?
从: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

例子:

运行这 4 个命令后:

ls
help
lss
ls nonexistentfile

我尝试测试只打印成功的命令(退出状态为 0),应该只有“ls”和“help”:

for j in `history | tail -5 | head -4 | cut -d ' ' -f5-`; do $j > cmd_out; if [[ `echo $?` != 0 ]]; then :; else echo $j | grep -v 'bash'; fi; done; rm cmd_out

这输出:

ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found

这有点有效,但有两个问题:

  1. 由于某种原因,grep -v 'bash'不排除包含“bash”的行,但如果我这样做grep 'bash',它将只包含带有“bash”的行,我不确定为什么一个有效,而另一个无效。
  2. 它通过字符串分隔每一行/命令。最后一个ls命令应该是
    ls nonexistentfile,但它正在运行ls并且nonexistentfile作为单独的命令。

知道我应该在命令中调整什么,或者如何去做吗?

答案1

这是我曾经在共享帐户上使用过的一个技巧,用于跟踪谁做了什么:

PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"

history它在显示之前写入PROMPT:实际上是在每个命令之后。您可以修改它以使用在历史记录中保存退出代码:

PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"

这会在您的历史记录中留下如下条目:

$ history 2
 1271  vim .bashrc #0
 1272  history 2

(最后的条目将被更新,命令history退出,因此退出代码在此输出中不可见。)

这会产生令人讨厌的效果,提示中的历史记录将具有注释:

$ # press up
$ history 2 #0

注释通常不会影响执行或输出,但会使编辑变得痛苦。

现在您可以通过grep历史记录来查看哪些代码成功退出:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.

相关内容