Ada*_*tan 24 bash command-history
有时我会误解命令的语法:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Run Code Online (Sandbox Code Playgroud)
我再试一次,结果正确:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Run Code Online (Sandbox Code Playgroud)
如何防止第一个错误代码不为 0 的命令进入历史记录?
Ren*_*soo 22
我不认为你真的想要那个。我通常的工作流程是这样的:
现在,如果失败的命令没有保存到历史记录中,我将无法轻松恢复修复并再次运行。
Den*_*son 13
我能想到的唯一方法是history -d
在$PROMPT_COMMAND
. 这种方法或任何方法的问题在于,无法判断命令是因错误退出还是以非零退出代码成功完成。
$ grep non_existent_string from_file_that_exists
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
最好有最后一个不正确的评论来纠正它,但不久之后,它就可能成为令人困惑的垃圾。
我的方法是两步:存储失败的命令,稍后删除它们。
error_handler() {
FAILED_COMMANDS="$(history | tail -1l | cut -c -5) $FAILED_COMMANDS"
}
trap error_handler ERR
Run Code Online (Sandbox Code Playgroud)
trap command signals
command
当其中之一signals
被“提升”时执行。
$(command)
, 执行command
并捕获其输出。
当命令失败时,这段代码捕获保存到 history 中的最后一个命令的历史编号,并将其存储在变量中以备将来删除。
简单,但与HISTCONTROL
and一起工作不正确HISTIGNORE
– 当命令由于变量之一而未保存到历史记录中时,保存到历史记录中的最后一个命令的历史记录编号是前一个命令的历史记录编号;所以,如果不正确的命令没有保存到历史记录中,以前的命令将被删除。
稍微复杂一点的版本,在这种情况下可以正常工作:
debug_handler() {
LAST_COMMAND=$BASH_COMMAND;
}
error_handler() {
local LAST_HISTORY_ENTRY=$(history | tail -1l)
# if last command is in history (HISTCONTROL, HISTIGNORE)...
if [ "$LAST_COMMAND" == "$(cut -d ' ' -f 2- <<< $LAST_HISTORY_ENTRY)" ]
then
# ...prepend it's history number into FAILED_COMMANDS,
# marking the command for deletion.
FAILED_COMMANDS="$(cut -d ' ' -f 1 <<< $LAST_HISTORY_ENTRY) $FAILED_COMMANDS"
fi
}
trap error_handler ERR
trap debug_handler DEBUG
Run Code Online (Sandbox Code Playgroud)
exit_handler() {
for i in $(echo $FAILED_COMMANDS | tr ' ' '\n' | uniq)
do
history -d $i
done
FAILED_COMMANDS=
}
trap exit_handler EXIT
Run Code Online (Sandbox Code Playgroud)
解释:
退出 Bash 时,对于每个唯一的历史编号删除相应的历史条目,
然后清除FAILED_COMMANDS
不删除从已删除命令中继承历史编号的命令。
如果您确定FAILED_COMMANDS
不会重复,您可以简单地对其进行迭代
(即 write for i in $FAILED_COMMANDS
)。但是,如果您希望它不是从最大到最小排序(在这种情况下总是如此),请替换uniq
为sort -rnu
。
历史编号FAILED_COMMANDS
必须是唯一的,并从大到小排序,因为当您删除条目时,下一个命令的编号将被移动 - 即。当您发出时history -d 2
,第 3 个条目变为第 2 个,第 4 个变为第 3 个,依此类推。
因此,在使用此代码时,您不能手动调用小于或等于存储在history -d <n>
其中的n
最大数字的位置FAILED_COMMANDS
并期望代码正常工作。
这也可能是钩好主意exit_handler
的EXIT
,但你也可以随时早期调用它。
归档时间: |
|
查看次数: |
4590 次 |
最近记录: |