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


10

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

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

0-成功执行命令
1-由于扩展或重定向期间出错,命令失败,退出状态大于零。
2-错误的命令用法
12-找到命令但无法执行
127-找不到命令

并可以通过以下命令检查执行命令echo $?
http : //www.linuxnix.com/2011/03/find-exit-status-script-command-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是单独的命令。

关于我应该在命令中进行调整或如何执行此操作的任何想法?

Answers:


4

我曾经在共享帐户上使用过这种黑客手段来跟踪谁做了什么:

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

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

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.

我在Mobaxterm和Putty上都尝试过,并获得ls #$CODE, ll #$CODE了历史记录输出。我不确定它是否对您有用,但是我不得不更改sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'sed -i '\$s/\$/ \#$CODE/' $HISTFILE。我在$ CODE之前取出了“
lkisac,2014年

@lkisac对我来说很奇怪,它#没有转义就给出了(没有代码)。必须是一些报价问题。
muru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.