在“滚动”到上一个命令后使用BASH ...如何在此历史记录中继续前进到下一个?


59

抱歉,这个标题不是我设计过的最优雅的标题。

但是我想很多人会对此感到疑惑,我的问题可能是愚蠢的……我只能说我还没有找到。

当我说“向上滚动”时,我的意思是使用键盘上的“向上箭头”键,它显然会从最新命令开始沿历史记录向上滚动。

因此,您找到了一个命令,也许有30个命令回退了……然后运行它。然后您想运行最初在它之后的命令...是否有一种简便的方法来执行此操作?或者那些精通BASH的人如何做到这一点?

Answers:


96

使用Ctrl+ o代替Enter运行命令将运行历史记录中的命令,然后将下一个队列排队,而不是返回bash历史记录的前面。


2
我只是在NetBSD上的xterm中运行的自己的bash中尝试了此操作,但这不起作用!是否有可能影响设置的设置?我没有.inputrc文件。在readline(3)的手册页中未提及Co。
Rhialto

@Rhialto您是否正在使用vi行编辑(启用set -o vi)或emacs?由于Ctrl-O不会与前者据我可以告诉工作。
B层

......但是这可以用命令来补救:bind "\C-o":operate-and-get-next(或后添加一切bind~/.inputrc
B层的

1
我发现了我的问题是:^ O被用作“刷新输出”字符(Linux不支持),并且readline处于活动状态时不会禁用它。我提供了一个简单的补丁程序,但bash和readline维护者认为这不是错误。我不同意。请参阅lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto

19

乔恩·莱因霍尔德(Jon Reinhold)的回答很好,但是我建议有一个更强大的解决方案。我在乔恩(Jon)的回答中也有一个评论,但是我没有足够的声誉可以直接发表评论,因此@Jon Reinhold,如果您阅读此书,请在下面给我留言。

Bash包含一个命令fc,该命令将bash历史记录列表的行号作为参数。然后,它将使用这些行作为文本打开您的默认编辑器。此时,您可以选择编辑行。然后,当您退出编辑器时,bash将执行这些行!

您可能要进行的编辑的一个示例是将除最后一行之外的所有内容追加到诸如“; read -p” next ...“之类的末尾,这将使bash执行每一行,并在继续之前提示您。

乔恩·莱因霍尔德(Jon Reinhold)的评论:好的答案,但是您应该使它符合条件,因为如果用户将bash变量HISTCONTROL设置为include erasedups,那么执行C-o该操作后,用户将感到困惑,因为该命令不是显示历史记录中的预期下一个命令,而是该命令之后的命令。将显示。这是因为bash删除了已执行命令的原始实例,因此之后的所有命令都上移了一行,即。到历史记录列表中的下一个索引号。


谢谢,试图通过搜索找到答案,我遇到了“ fc”命令。对我来说,这代表着BASH新手在迈向荣耀的光辉道路上迈出的缓慢步伐。我想要的第一小步。
麦克啮齿动物

3
所以它发生@mikerodent号fc早都Ctl-obash自己。(与该答案相反,它的用处也较小。)
kubanczyk

1
问题erasedups显然是一个bash错误(可能已经针对这种情况进行了准备)。很高兴知道。
Alexis

2
@kubanczyk有待辩论。如果这是一个复杂,复杂的命令(取决于需要解决的问题),那么使用我选择的编辑器来更新该命令会更快。这也将更加容易。
Pryftan

14

完成你想要的行为另一种方法是,以熟悉bash的readline的快捷方式(其中CTRL- o是一个我相信)和bash历史搜索。

历史搜索

CTRL- r带您进入bash命令历史记录搜索,您可以在其中开始键入要搜索的命令,bash会自动为您完成命令。自动完成功能确实非常不错。当您要运行的命令在输入行上时,您可以ENTER运行该命令,CTRL- e键将光标移至命令行末尾并退出历史记录搜索模式。

有很酷的事情CTRL- e在这一点上是历史缓冲区设置情境此命令。现在,下一个和上一个命令是在历史记录搜索为您找到的行之前和之后运行的命令。您可以按向上或向下箭头并抓住下一个命令。

历史记录搜索功能非常强大,并且是避免使用向上箭头首先返回到命令的一种好方法。快速的历史记录搜索可以节省大量时间来手动搜索历史记录,然后您可以继续进行操作CTRL- o就像上面提到的Jon一样。

Readline快捷键

如果您希望提高整体bash效果,建议您尝试一下箭头键的readline快捷方式。您可能会发现它们更方便并且可以提高键入速度,但是YMMV当然可以。这里还有一些:

  1. CTRL- n用于下一个命令(等效于向下箭头)
  2. CTRL- p对于上一个命令(等效于向上箭头)
  3. CTRL- b返回一个字符(等效于左箭头)
  4. CTRL- f转发一个字符(等效于右箭头)

这些readline快捷方式(以及CTRL- a行首和CTRL- e行尾)将提高命令行imo的速度和效率。


2
我不知道。我发现使用修改键的速度比箭头键或其他任何单键操作的速度都要慢。至于EOL / etc。我倾向于使用Home / End键(当然,stty -a也显示了一些非常方便的功能)。
Pryftan

@Pryftan相当公平,最后一句话是作为一种观点提出的(请参阅“ imo”)。我确实相信,长期使用键盘可以让自己在终端上工作,也可以从事其他繁重的打字任务。有些人的键盘上的箭头键与其他字符更接近,在这种情况下,阅读线快捷方式可能不是很方便的选择。我将编辑答案,以使最后一点更明确地表达意见。
111 ---

1
@datUser Tbh我错过了“ imo”(或者,如果我不忽略的话,完全可以)。正确的是,反向搜索对您有用(+1)。当然,fc也是(如上所述),因此也使用!(等等。)。在Unices中,有很多方法可以给猫做皮。至于键盘,这也很正确:我有一个Unicomp键盘(喜欢它并带回了记忆),但是当然还有其他键盘要考虑,更不用说Dvorak了。最后,您拥有的选择越多,您的生活就越好,您的工作(或娱乐)
就越
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.