我经常发现自己在编写一个长命令(或命令链)的过程中,意识到我需要运行另一个命令,然后才能完成当前的命令。
例子
有时候我...
- 需要找到网络接口的确切名称(
wlp2s0b1
--blargh); - 需要查看某个命令的文档;
- 需要启动一个守护进程(使用
systemctl
、service
等)才能与其通信; - 如果我使用 sudo 执行命令并且制表符补全不起作用,则需要
sudo ls
一个目录,因为我没有正在操作的目录的权限。
我想对我来说理想的解决方案是使用键盘快捷键将当前命令推送到堆栈并清空该行,以及另一个将堆栈中的顶部命令弹出到输入行的命令。
我目前使用的有点解决方案:
- 使用鼠标在终端中选择命令(如果我有可用的图形终端)并复制它,准备好后粘贴(慢的);
- 按 Enter 键(希望该命令只是失败而不是删除内容)并使用↑来恢复它(危险的);
- 再次输入(耗时)
关于如何更好地实现这一目标有什么建议吗?我会zsh
尽可能地使用,但如果有一个bash
同样有效的解决方案,我们将不胜感激。
答案1
对于 zsh,有三个小部件,它们可以绑定到该效果:push-input
、push-line
和push-line-or-edit
(请参阅man 1 zshzle
了解更多信息)。在顶级提示符上(PS1)它们的行为相同:当前缓冲区被推入缓冲区堆栈,然后清除。在下一个提示时(或调用 widget 时get-line
),缓冲区将从堆栈中弹出并加载到编辑缓冲区中。这也意味着您可以搁置多个命令。
默认情况下push-line
绑定到^Q
( Ctrl+ q,可能不起作用)、^[Q
( Alt+ Shift+q或Esc, Shift+ q) 和^[q
( Alt+q或Esc, q)。但您可以轻松地将其绑定到另一个组合bindkey
。例如对于Alt+ h:
bindkey '^[h' push-line
如前所述,这三个小部件在顶级提示中的行为相同。但如果是多行输入二级提示,它们确实有所不同(PS2)。
push-input
总是将完整的多行结构推入缓冲区。这就是自上次顶级提示以来的所有内容。您将返回到顶级提示符。
push-line
只将当前行推入缓冲区。这就是自上次提示以来的所有内容。您仍保持相同的提示级别。
push-line-or-edit
将整个当前多行结构推入编辑器缓冲区(不是堆栈)。它本质上做了什么
push-input
,但立即再次从堆栈中弹出缓冲区。
这些小部件的对应部分是get-line
,它从缓冲区中弹出顶行并将其插入到光标位置。在 Emacs 模式下,它绑定到^[G
( Alt+ Shift+g或Esc, Shift+ g) 和^[g
( Alt+g或Esc, g)
为了有效地使用push-line-or-edit
,您应该知道(或想要学习)编辑命令行所需的一些命令(复制并粘贴单词和行,插入新行(不运行命令)等)。否则,我建议使用push-line
和/或push-input
。
答案2
为什么不使用第二个 shell 来检查详细信息呢?我用screen
它,或者只是切换到第二个桌面,我(通常)也有一个开放的外壳。这样,我只需要多花一个快捷方式切换到备份 shell,再多花一个快捷方式切换回来。
当然,这种技术在您描述的最后一种情况下不起作用,因为我的第二个 shell 不会具有与第一个 shell 相同的工作目录。