在bash历史记录中执行一系列命令的快捷方式是否存在?


20

假设我的示例如下history

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

如果我想执行命令77,,78并且79在一个命令中,是否存在用于此操作的快捷方式?我已经尝试过了!77 !78 !79,这只会将它们全部放在一行上执行。


9
!77 ; !78 ; !79好吗?

1
我想除了逐行键入以外的任何内容都可以,但是希望有一些简洁的方法(以及!77-79
MrDuk

1
@MrDuk,男孩这样做花了我一段时间才能记住。简洁的解决方案请参阅我的最新答案!:)
通配符

太神奇了!:)
MrDuk '17

Answers:


28

编辑:您可以使用fix命令工具fc以POSIX兼容的方式执行此操作:

fc 77 79

这将vi在缓冲区中使用命令77至79 打开您的编辑器(可能是)。保存并退出(:x)后,将运行命令。


如果您不想编辑它们,并且非常确定知道要调用的命令,则可以使用:

fc -e true 77 79

true用作“编辑器”来编辑命令,因此它直接退出而不进行任何更改,并且命令按原样运行。


原始答案:

您可以使用:

history -p \!{77..79} | bash

假设您没有使用任何别名或函数,也没有使用仅在当前执行环境中存在的变量,因为这些变量在启动的新Shell中将不可用。


更好的解决方案(感谢Michael Hoffman在评论中提醒我):

eval "$(history -p \!{77..79})"

eval实际上非常适合的极少数情况之一!


另请参阅:


2
如果有任何命令更改了当前执行环境(例如,通过更改变量或执行),则此操作将无法正常工作cd,但这是一种极端情况。
G-Man说'Resstate Monica''17

3
eval "$(history -p \!{77..79})"应该管用。
Michael Hoffman

1
@MichaelHoffman,我想到了这一点,并以为自己尝试过,但是我才意识到自己没有引用!天哪!难怪它不起作用...正在编辑答案。
通配符

14

简单答案:代替!77 !78 !79

  • 键入!77; !78; !79要执行的操作—无条件地执行命令77,然后命令78,然后是命令79,或者
  • 键入!77 && !78 && !79 以执行命令77,并检查命令是否成功。然后,如果命令77成功,则执行命令78。然后,如果命令78成功,则执行命令79。

稍微聪明一点的答案(如果您在终端类型的窗口中):

  • 找出下一个要键入的命令号。
    • 可以在您的提示中包括此内容;我相信是通过将包含\!在您的中PS1
    • 或查看您的历史记录清单。如果最后一个输入是82 history,那么下一个命令是83。
  • 减去83-77 = 6。
  • 输入!-6。这将重新执行命令77。
  • 选择!-6,将其复制并粘贴。由于重新执行命令77(./generator.sh)是命令83,因此您现在处于命令84上,因此!-6将重新执行命令78。
  • !-6根据需要重复粘贴。
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.