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


49

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

$ !432; !433; !434; !435

我很好奇,有没有更有效的方法来做到这一点?


1
不要将其发布为答案,因为它不执行命令,但是您可以键入history -p \!43{2..5}以将命令432至435打印到终端,适合后续复制/粘贴。
通配符

Answers:


48

如果它引用刚运行的命令,一种更有效的方法是用负数引用它们:

!-4; !-3; !-2; !-1

另外,一旦您执行了此操作,您的上一个历史记录条目将包含整个命令链,因此您可以使用来重复它!!


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

eval "`fc -ln -4 -1`"

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

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

 fc -4 -1

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


我刚刚读了我写的东西……哈哈。实际上,我不确定要重新调用(也许要重新调用吗?),但是感谢您告诉:)我总是感谢您进行更正。
rozcietrzewiacz

Scrabblefinder.com说重新调用是有效的Scrabble单词。没有比这更确定的了。:)
BentFX

1
有了一个很好的答案(+1),您如何拼写就无关紧要;尤其是在3种主要的英语词典中都没有显示拼写形式的情况下:牛津,坎格里奇,梅里亚姆·韦伯斯特(我会去使用连字符)
Peter.O 2011年

34

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

fc -ln 432 435

要再次执行它们:

eval "$(fc -ln 432 435)"

4
非常好。不过我很好奇,为什么man fc不给我任何东西。代表什么fc?还有什么其他选择?
埃里克·威尔逊

2
@Eric Wilson ...键入help fc...以及help help.... help:帮助[-dms] [模式...]显示有关内置命令的信息。
Peter.O 2011年

我刚回到这里,寻找您的答案。这确实是一个很棒的内置功能!尤其是当您使用它的默认功能时-调用编辑器来修改要重播的命令范围。谢谢,吉尔斯。
rozcietrzewiacz 2012年

1
没有-l标志,它将不需要邪恶而执行eval
Bernhard 2013年

1
@EricWilson谷歌搜索使我进入“ Unix in a Nutshell” 一书该书表示fc“ find command”或“ fix command”。
Slothworks,2015年

10

有一种不错的替代方法可以从Bash历史记录中按顺序运行许多命令:您可以使用+ 搜索整个历史记录,
而无需使用历史记录替换(!432!-4),而只需找到历史记录即可。运行,请按+ (操作并获取下一个)而不是键。 这将启动命令并提出历史记录中的下一个命令。您可以随意打几次,并以最后一个序列结束序列,或者在不启动序列的情况下停止序列。CtrlrCtrloreturn
Ctrl+oreturnCtrl+c


嗯,在我点击Ctrl-o它之后,它只会输出一个文字^o并破坏我的(reverse-i-search)。也许还有其他设置。
Ciro Santilli新疆改造中心法轮功六四事件

8

要立即执行命令而不是编辑命令,下面是使用evalGiles Answers语法上更苗条的版本:

fc -e: 432 435

-e的冒号参数是bash noop,其作用是跳过fc所需的“在编辑器中打开”步骤。而且,现在(最近)历史记录将包含历史记录中的实际命令,而不是eval语句。


0

fc for循环和 xsel

当我要连接并重新运行最后n个命令多次时,此方法效果很好:

fcn() (
  from="${1:-2}"
  to="${2:-1}"
  if [ "$from" -ne "$to" ]; then
    for i in `seq "$from" -1 "$(($to + 1))"`; do
      printf "$(fc -ln -${i} -${i}) && "
    done
  fi
  printf "$(fc -ln -${to} -${to})"
)

然后:

$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$  echo a &&  echo b &&  echo c
a
b
c
$ # Paste again if you feel like it.
$  echo a &&  echo b &&  echo c
a
b
c

或对于可能需要进行一些编辑的较大命令:

fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
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.