如果我没有输入命令,有没有办法在 Ubuntu 终端中保存命令?

如果我没有输入命令,有没有办法在 Ubuntu 终端中保存命令?

我想知道是否有一种快速的方法可以在 Ubuntu 的终端中保存命令。场景是:

问题:

  1. 输入[长命令]
  2. 忘记了在运行 [长命令] 之前我需要运行 [另一个命令]

我希望能够以一种简单的方式保存命令以供以后使用,而不仅仅是在#它前面放置 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

相关内容