Bash历史重新运行:可能的命令,以避免使用!爆炸!?

时间:2009-03-10 16:08:22

标签: bash shell scripting grep history

情境:

你正在做你的每日Bash shell的东西。您想运行上一个命令,因此键入:

history | grep foocommand

然后,您会得到一份列表,其中列出了您在历史记录保持跟踪的过程中所做的所有foocommand内容,如下所示:

  585 foocommand --baz --bleet
  750 foocommand | grep quux
  987 history grep | foocommand

您决定要运行命令585,因此键入

  !585

问题:只是出于好奇,有没有办法让最后一步走出这个等式并仍能获得预期结果?如果有办法说出来会很好:

 "grep through history and automatically run the first item on the list"

"grep through history and let me choose which item to run using the arrow keys"

5 个答案:

答案 0 :(得分:5)

^r(即CTLR-r),输入foocommand按Enter;) 这将搜索历史记录并显示最新的匹配条目

答案 1 :(得分:3)

你试过'!f'吗? 'f'作为foocommand的第一个字母。

答案 2 :(得分:1)

语法

!foo

将运行以foo开头的最后一个命令。

如果失败,bash会使用readline库进行输入,它支持可以绑定到您选择的键的history-search-forwardhistory-search-backward命令。我编辑了我的./inputrc文件,将它们绑定到F8和Shift-F8,这样当我与PuTTY连接时,它们就像控制台中的Windows等效功能一样:

"\e[19~":history-search-backward
"\e[32~":history-search-forward

答案 3 :(得分:1)

就个人而言,我使用的是源自ksh的别名:

alias r="fc -e -"

('r'代表'重新运行',我想......)

我可以重新运行以'foo'开头的最后一个命令:

r foo

我可以重新运行命令46到50:

r 46 50

我可以重新运行命令585:

r 585

唯一的问题是,如果你输入:

$  cd somewhere

然后运行'r cd'将无效,因为'cd'命令前面有一个额外的空间。 'fc'命令是历史记录的基础,您可以在重新运行命令之前编辑命令46到50:

fc 46 50

等等其他变种。

(别名中的'-e - '表示'使用空编辑器编辑';你可以写'fc -e vim'用vim编辑,但大多数人设置VISUAL或EDITOR或FCEDIT或全部三个来制作这是不必要的。)

其余的,作为一个'vim'人(狂热?),我使用'set -o vim'然后搜索工具:ESC和

/grep\ -e\ 'whatever

搜索包含“grep -e'thatever”的命令的历史记录。我可以重复搜索,在历史中向后移动,或者在超调后反向移动,或者......我认为emacs模式具有相同的搜索机制。

答案 4 :(得分:0)

  

“grep through history并自动运行列表中的第一项”

好。

`history | grep foocommand | head -1 | tr -s ' ' | cut -d ' ' -f 3-`

尝试一下,它就像一个冠军!