情境:
你正在做你的每日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"
答案 0 :(得分:5)
按^r
(即CTLR-r
),输入foocommand
按Enter;)
这将搜索历史记录并显示最新的匹配条目
答案 1 :(得分:3)
你试过'!f'吗? 'f'作为foocommand的第一个字母。
答案 2 :(得分:1)
语法
!foo
将运行以foo
开头的最后一个命令。
如果失败,bash会使用readline库进行输入,它支持可以绑定到您选择的键的history-search-forward
和history-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-`
尝试一下,它就像一个冠军!