history - 只列出成功运行的命令

lki*_*sac 11 bash command-history

我想知道是否有办法使用history命令但只列出成功运行的命令。同样,有没有办法列出产生错误的那些?

我知道每个命令都有一个退出状态:

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
Run Code Online (Sandbox Code Playgroud)

我尝试测试只打印成功的命令(退出状态为 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
Run Code Online (Sandbox Code Playgroud)

这输出:

ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found
Run Code Online (Sandbox Code Playgroud)

这有点工作,但有两个问题:

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

关于我应该在命令中调整什么,或者如何去做这件事的任何想法?

mur*_*uru 5

这是我曾经在一个共享帐户上使用的一个 hack 来跟踪谁做了什么:

PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)

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

PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)

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

$ history 2
 1271  vim .bashrc #0
 1272  history 2
Run Code Online (Sandbox Code Playgroud)

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

这会产生令人讨厌的效果,即提示中的历史记录将包含以下评论:

$ # press up
$ history 2 #0
Run Code Online (Sandbox Code Playgroud)

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

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

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
Run Code Online (Sandbox Code Playgroud)