我想知道是否有一种快速的方法可以在 Ubuntu 的终端中保存命令。场景是:
问题:
- 输入[长命令]
- 忘记了在运行 [长命令] 之前我需要运行 [另一个命令]
我希望能够以一种简单的方式保存命令以供以后使用,而不仅仅是在#
它前面放置 a 并将其放入向上和向下键历史记录中。最好将其直接保存到寄存器或剪贴板。
我忘了说我也不想附和。
答案1
这不是你的终端, 这是你的壳。
您正在寻找的 shell 机制的名称是终止缓冲区。人们忘记了 shell 命令行编辑器有这些。 Z shell 中的 ZLE 拥有它们,Bourne Again shell 中的 GNU Readline、(FreeBSD) Almquist shell 中的 libedit、Korn shell 的行编辑器和 TENEX C shell 的行编辑器也有。
在模式下的所有这些 shell 中emacs
,只需转到要保存的行的末尾,使用⎈ Control+将其杀死到头部终止缓冲区U,键入并运行中间命令,然后使用⎈ Control+提取终止缓冲区内容Y。确保在输入中间命令时不对终止缓冲区执行任何操作。
在模式下的 Z shell 中vi
,您可以使用vi
前缀序列来指定vi
要终止行的命名样式缓冲区。您可以使用其他缓冲区之一来代替默认缓冲区。只需使用类似" a d d(在vicmd
模式下)的方法将整行删除到缓冲区“a”中,键入并运行中间命令,然后将该缓冲区的内容放入" a p.
在它们的vi
模式中,Korn shell、Bourne Again shell 中的 GNU Readline 和 (FreeBSD) Almquist shell 中的 libedit 没有命名vi
样式缓冲区,只有单剪切缓冲区。 d d将行删除到该缓冲区中,然后将缓冲区内容与p, 一起放入即可。但它使用vi
与输入中间命令时 Kill 和 yanking 相同的样式缓冲区。
答案2
您不想echo
在您的行中添加(或任何其他无操作类型命令),因为您可能有 I/O 重定向,并且它们仍然会被执行,可能会覆盖您可能仍然需要访问的任何文件(直到您已准备好执行命令)。
相反,请转到行的开头并输入注释字符#
。然后您可以按Enter,该线路将保存在您的历史记录中。
如果您处于 vi 模式,ksh 和 bash(至少)有一个特定的命令:进入命令模式(按Esc),然后按该#字符。
这是专门针对此用例的。 O'Reilly 中对该命令的描述学习 Korn Shell书上说:
在该行前面添加#(注释字符)并将其发送到历史文件;对于保存稍后执行的命令很有用,而无需重新输入。如果该行已以 # 开头,请删除前导 # 以及多行命令中换行符后面的任何其他注释字符。
答案3
如果您正在运行zsh
,则可以使用 来Ctrl-Q运行命令push-line
。它将把您当前输入的内容保存到堆栈中,清除提示,然后在输入下一个命令后弹出堆栈。我一直用这个来解决你所描述的情况。
答案4
如果您的 shell 设置为emacs模式(我相信 bash 通常默认):
#set -o | grep emacs
emacs on
然后你可以:
<Ctrl>a or <arrowkeys> # to go to the beginning of the current line or to wherever you want
<Ctrl>k # to "kill" the content from the cursor position to the end of the line + SAVE it
... here you type the command you forgot to add ...
<Ctrl>y # to "yank" the SAVED line into the current editing line. or <Ctrl>p in ksh(??)
<Enter> # to execute it
#note: you can also replace: <Ctrl>a<Ctrl>k with: <Ctrl>u # kills the whole line + SAVE it
这很快就能做到,并且会成为一种习惯。 ctrl-k 也可以用于仅保存一行的“结尾”(例如:2 个长参数,您知道稍后会重复使用它们,您可以“杀死”(+保存),然后可以“复制”只要你想经常回来)
如果您的外壳位于六模式下,您可以使用常用的 vim 命令:
<Esc> # to go back to normal(command) mode, if you were in editing mode
dd # to delete the whole current line + SAVE it (see note below)
i # to reenter editing mode
... here you type the command(s) you forgot ...
<Esc> # to return to normal mode
p # to paste the buffered line + place the cursor on top of the last character
a # to reenter editing mode past that current character
<Enter> # to execute it
# note: instead of "dd" (kill whole line) you can simulate emacs <Ctrl>a<Ctrl>k with:
# | or h or l # to go to the 1st char of the line or wherever # simulates <Ctrl>a or <arrow keys>
# d$ # to delete from the current position to the end of the line + SAVE it # <Ctrl>k