如何从历史中执行连续的命令?

Eri*_*son 54 command-line bash command-history

假设我要执行之前执行过的四个命令的序列。如果命令历史中的第一个是 432,那么我可以这样做:

$ !432; !433; !434; !435
Run Code Online (Sandbox Code Playgroud)

我很好奇,有没有更有效的方法来实现这一目标?

roz*_*acz 53

如果它指的是最近运行的命令,更有效的方法是用负数引用它们:

!-4; !-3; !-2; !-1
Run Code Online (Sandbox Code Playgroud)

此外,一旦您执行此操作,您的最后一个历史记录条目将包含整个命令链,因此您可以使用!!.


编辑: 如果你有没有准备好,熟悉伟大内置函数fc由吉尔提到。(使用help fc。)事实证明,您也可以使用负数,因此您可以使用与上面相同的方法

eval "`fc -ln -4 -1`"
Run Code Online (Sandbox Code Playgroud)

不过,这有一个警告:在此之后,该eval行将作为最后一个命令存储在历史记录中。所以如果你再次运行它,你会陷入一个循环!

一种更安全的方法是使用默认fc操作模式:将选定的命令范围转发到编辑器,并在退出后运行它们。尝试:

 fc -4 -1
Run Code Online (Sandbox Code Playgroud)

您甚至可以颠倒命令范围的顺序: fc -1 -4


Gil*_*il' 38

要查看历史记录中的一系列命令,请使用内置fc命令:

fc -ln 432 435
Run Code Online (Sandbox Code Playgroud)

再次执行它们:

eval "$(fc -ln 432 435)"
Run Code Online (Sandbox Code Playgroud)

  • 非常好。不过我很好奇,为什么`man fc` 没有给我任何东西。“fc”代表什么?还有哪些其他选择? (5认同)
  • *@Eric Wilson* ... 输入 `help fc` ... 以及 `help help` .... *help: help [-dms] [pattern ...] 显示有关内置命令的信息。* (2认同)

小智 13

有一种很好的替代方法可以从 Bash 历史记录中按顺序运行许多命令:您可以使用+搜索历史记录,
而不是使用历史替代(!432!-4),一旦找到您想要的第一个命令运行,点击+ (操作和获取下一个)而不是键 这将启动命令并从历史记录中建议下一个。您可以根据需要点击任意次数,并以最后一个结束序列,或者停止而不启动它。CtrlrCtrloreturn
Ctrl+oreturnCtrl+c


小智 12

要立即执行命令而不是编辑它们,这里是使用 eval语法更精简的Giles 答案版本:

fc -e: 432 435
Run Code Online (Sandbox Code Playgroud)

-e 的冒号参数是 bash noop,它的作用是跳过 fc 想要的“在编辑器中打开”步骤。此外,现在(最近的)历史将包含来自历史的实际命令,而不是 eval 语句。