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)
小智 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 语句。