4

设想:

你每天都在做 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"
4

5 回答 5

5

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

于 2009-03-10T16:13:13.857 回答
4

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

于 2009-03-10T16:09:59.653 回答
2

就个人而言,我使用从 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 -”表示“使用 null 编辑器进行编辑”;您可以编写“fc -e vim”来使用 vim 进行编辑,但大多数人设置 VISUAL 或 EDITOR 或 FCEDIT 或全部三个以使其不必要。 )

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

/grep\ -e\ 'whatever

搜索包含“grep -e 'whatever”的命令的历史记录。我可以重复搜索,在历史上进一步向后移动,或者在超调后反向,或者......我假设 emacs 模式具有等效的搜索机制。

于 2009-03-11T06:57:36.900 回答
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
于 2009-03-10T16:14:07.943 回答
1

“通过历史记录并自动运行列表中的第一项”

好的。

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

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

于 2009-03-10T16:21:12.560 回答