我想知道是否有办法使用历史命令但仅列出已成功运行的命令。同样,是否有一种方法可以列出产生错误的错误?
我知道每个命令的退出状态为:
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
这有点有效,但有两个问题:
- 由于某种原因,
grep -v 'bash'
不排除包含“bash”的行,但如果我这样做grep 'bash'
,它将只包含带有“bash”的行,我不确定为什么一个有效,而另一个无效。 - 它通过字符串分隔每一行/命令。最后一个
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.