Tom*_*Tom 6 bash command-history
我正在寻找一种我从未见过的微妙的历史行为。
~/.bash_history,我想省略失败的命令。希望推理是明确的:在会话中,历史记录最常见的用途之一是重新尝试最后一个(失败的)命令,无论是通过微小的编辑,还是在更改一些环境事实以期获得更好的结果之后。
但是,与此同时,我不希望我的长期历史充斥着糟糕的命令。
我看过这篇文章,它展示了如何 (1) 确定最后一个命令的退出状态,以及 (2) 如何通过索引删除历史条目。
我已经看到了这个答案,它展示了如何trap在会话结束时执行命令。
(我还研究了这个超级答案,它似乎涵盖了许多与历史操纵有关的怪癖。虽然我不确定它的相关性。)
我对如何实现目标有一个粗略的想法,但我对 bash 编程不是很熟悉,而且我很难兑现。我的计划:
$TEMP/.bash_history_failures_IDENTIFIER为每个终端会话创建一个新文件,替换IDENTIFIER为某种特定于会话的值(PID?),以保证多个会话不会相互破坏number=$(history 1)和[ $exit_status -eq 127 ],我写的每一个坏命令的指数当前会话的失败文件trap钩子在退出时执行代码,我调用一个函数,该函数遍历此会话失败文件中的索引,history -d $number对每个条目执行~/.bash_history根据我的HISTCONTROL设置写入内存中历史记录的剩余部分(应该是所有且仅是成功的命令)我的提议可行吗?我在看什么?按升序从历史记录中删除项目会遇到问题吗?为每个会话创建唯一文件的好的、稳定的方法是什么?
我认为什么是“失败”的命令?
我不希望长期历史记录包含用户错误:
我想保留正确的命令,即使它们由于其他原因(例如权限不足、输入路径不存在)而无法执行。
我想到的两个例子是,我经常忘记在这样的单行中插入分号的位置:
for pkg in $(ls ./packages); do cp ./.eslintrc.yml ./packages/$pkg/; done
Run Code Online (Sandbox Code Playgroud)
我不希望历史记录包含我将半决赛放在错误位置的条目。
另一种情况是,我通常需要多次尝试才能为 找到正确的选项cut,而且我的大部分错误是指定参数时的语法错误。
如果我的长期 bash 历史可以省略使工作命令正确的许多失败尝试,我会喜欢它。我不关心包含例如碰巧没有结果的搜索的历史记录。
编辑添加:
用于管理历史记录的hstr CLI 工具喜欢在 shell 配置文件中添加一些东西:
$ hstr --show-configuration
# HSTR configuration - add this to ~/.bashrc
alias hh=hstr # hh to be alias for hstr
export HSTR_CONFIG=hicolor # get more colors
shopt -s histappend # append new history items to .bash_history
export HISTCONTROL=ignorespace # leading space hides commands from history
export HISTFILESIZE=10000 # increase history file size (default is 500)
export HISTSIZE=${HISTFILESIZE} # increase history size (default is 500)
# ensure synchronization between bash memory and history file
export PROMPT_COMMAND="history -a; history -n; ${PROMPT_COMMAND}"
# if this is interactive shell, then bind hstr to Ctrl-r (for Vi mode check doc)
if [[ $- =~ .*i.* ]]; then bind '"\C-r": "\C-a hstr -- \C-j"'; fi
# if this is interactive shell, then bind 'kill last command' to Ctrl-x k
if [[ $- =~ .*i.* ]]; then bind '"\C-xk": "\C-a hstr -k \C-j"'; fi
Run Code Online (Sandbox Code Playgroud)
我有一种预感,可以从 hstr 的代码库中提取解决方案。
小智 1
尝试这个:
export PROMPT_COMMAND='LAST_COMMAND_EXIT=$? && history -a && test 127 -eq $LAST_COMMAND_EXIT && head -n -2 $HISTFILE >${HISTFILE}_temp && mv ${HISTFILE}_temp $HISTFILE'
Run Code Online (Sandbox Code Playgroud)
如果退出状态为 127,只需删除 histfile 的最后两行(时间戳和命令)。对我来说效果很好,如果您在历史记录中没有时间戳,则应该head -n -1使用-2
当然,您应该将此行添加到您的 .bashrc 以使其持久。
| 归档时间: |
|
| 查看次数: |
712 次 |
| 最近记录: |