将历史记录命令放到命令行而不执行


57

我使用!n,其中(n)是执行历史记录文件中的行的行号,该文件我要在我通过history |找到的命令提示符下执行。

但是有一个我希望手动修改的命令行历史记录事件。如何在未实际执行的情况下将历史事件内容插入命令行,以便进行修改然后按回车键?

最好,

Answers:


71

要请求打印命令而不是在替换历史记录后执行命令,请添加:p 修饰符,例如!42:p。结果命令也将输入到历史记录中,因此您可以按Up编辑它。

如果您设置了histverify 选项shopt -s histverify),您将始终有机会编辑历史记录替换的结果。

fc内置给人以历史扩展(无字标志)的机会有限,并且让你在外部编辑器中编辑以前的命令。

您可以!prefix用来引用以开头的最后一个命令prefix,也!?substring可以引用以开头的最后一个命令substring。当您知道要查找的内容时,可以节省很多时间history | less

搜索以前的历史记录的另一种方法是增量搜索:按Ctrl+ R并开始输入要查找的内容的子字符串。按Ctrl+ R转到到目前为止搜索字符串的上一个出现位置,按Ctrl+ S如果您走得太远。比其他大多数键Ctrl+ RCtrl+ SBackspace和普通字符终止增量的搜索,并具有其通常的影响(如箭头键移动光标,你已经达到了线,Enter运行该命令)。


您的第一个示例中有错别字...
pbm 2010年

9
您需要先完成stty -ixonCtrl-s的操作。
丹尼斯·威廉姆森

@Dennis:哇,现代的终端仿真器默认不这样做吗?<test>是的,即使Ubuntu中的gnome-terminal也具有流控制功能!
吉尔斯(Gilles)2010年

我不知道他们为什么仍然这样做。滚动时无法捕捉到某些东西。按下Ctrl-s时,会再次出现提示。缓慢的串行连接已成为过去。
丹尼斯·威廉姆森

@Dennis的观点Ctrl-s很重要,否则有人会像我一样陷入困境。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

15

另一个小:Alt+#

注释掉当前行并将其移到历史记录缓冲区中。

因此,在组装命令行时,您需要发出临时命令来查找文件,例如,只需按Alt+ #,发出另一个命令,进入历史记录,取消注释并继续。


2
此外Esc#作品
史蒂文·彭妮

而且您实际上可以在Mac上键入它(按住Shift键,同时按ESC和#键),与其他ket组合键(fn + alt + shift +#);-)
0xF2

7

您可以使用魔法空间来扩展历史记录,然后再按Enter键。在您的.inputrc中,将空间映射到魔术空间:

$if Bash
     Space: magic-space
$endif

现在,只要您在历史记录说明后输入空格,它就会立即展开-如果您也想编辑它,将非常方便!



4

使用Ctrl+r您可以搜索历史记录:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

您发现的任何命令都可以编辑...


我认为我完全找到了您需要的东西:运行shopt -s histverify并在下次要使用!n命令时将不会执行,而只会放在命令行中...


您必须先执行命令,然后才能使用Ctrl + r而不是Vass要求的命令对其进行搜索。
phunehehe

1
我不明白这怎么不能满足他的要求。我要补充一点,如果您想在运行命令之前先对其进行编辑,则只要找到正确的命令,就可以直接单击TAB。
史蒂文D

2
因此,过程将是:(1)Ctrl + r,(2)键入直到找到命令,(3)TAB,(4)编辑命令,(5)ENTER。
史蒂文D

1
@phuenhehe:“但是有一个命令行历史事件我想手动修改”
pbm 2010年

1
不行!n:p
Alex

1

我经常想要这个。当我使用csh(和tcsh)时,我有一个成语:
!:88*:p

该惯用法在您在当前命令行上键入的位置(通常是结尾)插入上一个命令的“单词88至最后一个单词”。在csh中,这样的表达式不产生任何单词不是错误。就是说,不需要88这个词,也不必紧随其后。如果没有单词88,则这不会在要键入的命令的末尾添加任何单词,然后将生成的命令行推入历史记录中而不执行。

您可能知道,
*!(例如!!和!-1)是上一个命令;
*:88是单词88(第一个单词-通常是命令-为零),并且csh会要求存在这样的单词,但是...
*:88 *是所有从单词88开始的单词,然后csh会不要求这个词存在;
*:p表示打印,但不执行命令行。
使用或不使用:p,命令行将添加到命令历史记录中。

“为什么是88?” 你想知道?因为它与我需要的*相同。如果您有那么长的命令,则可能需要!:888 *:p。抱歉,这不适用于bash AFAIK。巴什只会说 bash: :88*: bad word specifier

有趣的事实:您的命令通常不需要先执行。
> /tmp/foo echo My command is word 3
在bash和csh中有效。


由于该问题被标记为bash,因此最好说您的解决方案仅在(t)csh中起作用。
zagrimsan

0

我通常使用Ctrl+ r搜索,然后Ctrl+ e转到线的末端不执行。



@JeffSchaller我没看到。我看到了CTRL + R参考。在上面的文章中,没有我在哪里可以看到CTRL + E的困惑了?
nikc
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.