如何在不执行的情况下保存您输入的命令?

use*_*488 58 bash history command

每个 Linux 用户都经历过这种烦人的事情:你开始输入一个又长又无聊的命令,然后意识到你之前应该执行另一个。如何保存第一个以便稍后执行?

例子

你开始打字

mycommand -a -F --conf /very/long/path --and /another/one /input/file.txt
Run Code Online (Sandbox Code Playgroud)

但是在按“Enter”之前,您意识到您应该cp f.txt /input/file.txt首先完成。

所以,你被你的命令困住了,如果你不按下Enter你将无法使用你的 bash 历史恢复它。

处理这个问题的最佳方法是什么?

D_B*_*Bye 59

点击CTRL- U(kill line - 这会在 shell 的 kill-ring 中保存该行),做你需要做的事情,然后在新的提示下,点击CTRL- Y(从 kill-ring 中拉出) 以取回原始命令。

或者,这在嵌套命令中特别有用,例如 a whileor forloop, hit CTRL- C,它将命令添加到历史记录中而不执行它并清除该行,因此您可以在以下情况下使用 shell 的历史记录机制调用它您已准备好使用它。

  • 您不需要转到行首 - 您可以使用 Cu 将行复制到剪贴板 (4认同)
  • 很容易忘记它并杀死其他东西。另外,一些奇怪的 `ksh` 版本已经破坏了 kill-ring。这就是为什么我总是使用 Esc-#(多个,易于回忆,可见)。 (2认同)

Emm*_*uel 32

注释该行,然后按 Enter

Ctrl——A
#
Enter

所以你把这条线保留在历史中

  • 除非您在“屏幕”中。事实证明,`Ctrl`-`A` 只会移动到行首,所以 `Home` 键也能正常工作。(`Home` -> `#` -> `Enter`) (3认同)

ari*_*lCo 28

在 Bash 和 Korn shell(Emacs 模式)中Esc-#就像将 a#放在开头并按Enter

例子:

$ find /{,usr/}{,s}bin/ -type f -ls | awk '$3~/^...s/' | nl
Run Code Online (Sandbox Code Playgroud)

Esc # ;

$ #find /{,usr/}{,s}bin/ -type f -ls | awk '$3~/^...s/' | nl
$ _
Run Code Online (Sandbox Code Playgroud)

笔记

1:在某些终端中,Alt+whatever作为和弦是另一种发送方式,Esc其次是whatever

2:#手段无论你需要按下得到一个“#”,所以你可能必须按EscShift+3Alt+ Shift+3

(谢谢@vi)

定制

在 Bash 中,您可以通过将这样的行添加到 来控制前缀.inputrc

set comment-begin "## "
Run Code Online (Sandbox Code Playgroud)

(仅当您有前导或尾随空格时才需要引号)

您还可以设置另一个绑定并取消绑定默认值Esc- #

"\e'": insert-comment
"\e#": nop
Run Code Online (Sandbox Code Playgroud)

https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html

  • 我通常将“Esc-#”作为“Alt+Shift+3”。 (4认同)

Sté*_*las 7

zsh在emacs模式,Alt+QCtrl+Qpush-line插件),推压在堆栈上的当前的命令行(保存供以后)并清除当前输入缓冲器。

然后您可以输入另一个命令,然后返回最后一个推送的命令(从该堆栈中弹出)。


msb*_*msb 5

如果您特别想保存命令,我通常会按照 Emmanuel 的建议进行操作。但如果只想在当前命令之前输入另一个命令,则无需保存。转到该行的开头,输入其他命令并添加分号。

Ctrl——A cp f.txt /input/file.txt ; Enter

这应该按照您想要的顺序执行这两个命令。更重要的是,它将一起保存在您的历史记录中,因此如果将来您想再次执行第二个命令并使用Ctrl-到达它R,您将在那里看到第一个命令并提醒它必须在之前执行(在您总是需要同时执行两者的情况)。

&&如果您希望 在第一个命令成功时才执行第二个命令,您可能还想使用分号代替分号。