Bash:选择与模式匹配的上一个命令

Ano*_*ous 3 bash shell

我知道带有向上和向下箭头的 bash 历史导航。

我想要一种懒惰的方式来选择与某些正则表达式匹配的前一个命令(比整个命令短,因此输入的时间更少)。

bash可以吗?

如果没有,其他shell有没有这样的功能?

Zso*_*kai 6

您始终可以CTRL-R向后搜索历史记录,并输入上一个命令的某些部分。再次点击CTRL-R(第一次点击后)会重复您的查询(跳转到下一个匹配项(如果有))。

就我个人而言,我使用它进行正则表达式搜索(因为正则表达式搜索尚不可能(AFAIK)):

# search (using perl regexp syntax) your entire history
function histgrep()
{
     grep -P $@ ~/.bash_history
}   
Run Code Online (Sandbox Code Playgroud)

编辑: 要通过该功能搜索最近的历史记录项目,请参阅(关于设置 $PROMPT_COMMAND )。


alt*_*lue 5

Zsolt,避免使用硬编码的文件名,改用 HISTFILE 变量,如果您真的很偏执,可以使用回退:${HISTFILE:-~/.bash_history} ;-)

为什么要直接通过历史文件grepping?!您将丢失历史编号,这是复制命令所必需的(例如 !33 以再次执行历史记录中的第 33 个条目),而无需复制和粘贴 grep 的输出。

请记住,使用这种 $@ 扩展可能会在各种(史诗般的)级别上失败。例如,以“-”(histgrep -h)开头的参数通常会挂起,或者用脚射击自己。事实上,这个基本示例可以很容易地解决,遵循经典的“--”方式将参数选项分开,但讨论没有结束,记住要提供给该 hack 的参数将是正则表达式。;-)

哦,难道 histgrep 是一个过于冗长的选择吗?h, i, Tab, g, Tab :)

恕我直言,我会坚持使用 ^R,回到历史 | grep ... 必要时。无论如何,为了这个例子,我会(懒惰地)将这个小帮手重写为:

function hgrep() { history | grep -P -- "$*"; }
Run Code Online (Sandbox Code Playgroud)