假设我的 中有以下简单示例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
,这将简单地将它们全部放在一行上执行。
答案1
编辑:您可以使用 POSIX 兼容的方式执行此操作修复命令工具fc
:
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
简单的答案:代替!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
根据需要重复粘贴。