令人尴尬的是,我经常发现自己重复了很多以前的命令。我Up Up Up去找第一个命令。Enter。然后Up Up Up再次执行第二个命令。等等。
有没有办法在重新运行命令后进入历史记录中的下一个命令?就像执行Up Up Up Shift+ Enter Shift+ Enter Shift+Enter重新运行最后三个命令一样很棒。
我知道fc
,但这不仅仅是关于外壳。我在 Python 解释器中以及基本上在任何我输入命令的地方都遇到了这个问题。
答案1
所有这些都与您的 shell 历史有关bash
,我刚刚注意到您可能在询问 Python。我希望这会有所帮助。
如果你history
看起来像:
1000 command A
1001 other command B
1002 yet another command C
你可以运行:
!com
这将运行以 ' ' 开头的最后一个命令com
,您可以有任意数量的字符(!c
或!command
),然后跟随!oth
和!yet
以便能够按顺序运行每个命令。
您还可以运行!1000
重新运行历史条目#1000,然后您知道!1001
并将!1002
运行接下来的两个命令。
就我个人而言,如果我想像这样运行一系列命令,我可能会像同一个命令一样运行多个命令,并为其提供一个历史记录条目:
command A; other command B && yet another command C
或者,创建一个别名:
$ alias doThing="command A; other command B && yet another command C"
$ doThing
或者,一个函数:
doThing() {
command A
other command B && yet another command C
# Can also use positional arguments: echo $1
}
$ doThing
考虑到所有这些,我不知道能够完全按照您的期望去做,抱歉。
答案2
在 中bash
,如果您运行history
并看到要运行的三个命令编号为 1000、1001 和 1002:
$ history | tail
...
1000 echo foo
1001 echo bar
1002 echo baz
1003 history | tail
在 中bash
,您可以通过在行号前加上 . 来仅运行其中一个!
。您还可以在一行上运行所有这些,并用分号分隔:
$ !1000;!1001;!1002
echo foo;echo bar;echo baz
foo
bar
baz
注意:像往常一样,当使用!
历史记录执行命令时,它首先显示要执行的命令行。
这在你的 python 解释器或大多数其他程序中可能不一样。它在其他一些 shell 中的工作方式确实类似,具有类似的历史功能。
顺便说一句,这个组合命令现在将在历史记录中仅作为一行:
$ history | tail -2
1004 echo foo;echo bar;echo baz
1005 history | tail -2
您可以使用 再次运行它!1004
。
答案3
是Ctrl+ O。你可以通过Up, Up,Up然后 Ctrl+ O, Ctrl+ O, Ctrl+O来执行最后三个命令。
由于这些命令被重新添加到历史记录中,您可以按住Ctrl+O重复执行这一系列命令。
来自阅读在线文档:
operate-and-get-next
Ctrl+ O:接受当前行以返回到调用应用程序,就好像已输入换行符一样,并从历史记录中获取相对于当前行的下一行以进行编辑。数字参数(如果提供)指定要使用的历史记录条目,而不是当前行。
这是 Readline 8.1 中相对较新的新增内容。 (2020 年 12 月。)