如何保存输入的命令而不执行它?

如何保存输入的命令而不执行它?

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

例子

你开始打字

mycommand -a -F --conf /very/long/path --and /another/one /input/file.txt

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

所以,你被困在你的命令中,如果你不按,Enter你将无法使用你的 bash 历史记录来恢复它。

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

答案1

点击CTRL- U(kill line - 这会将行保存在 shell 的kill-ring中),执行您需要执行的操作,然后在新的提示符下,点击CTRL- Y(从kill-ring中拉出)以取回原始命令。

或者,如果您处于嵌套命令(例如whileorfor循环)中,则这特别有用,点击CTRL- C,它将命令添加到历史记录中而不执行它并清除该行,因此您可以在以下情况下使用 shell 的历史机制来调用它:你已经准备好使用它了。

答案2

注释该行然后按 Enter 键

Ctrl-A
#
Enter

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

答案3

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

例子:

$ find /{,usr/}{,s}bin/ -type f -ls | awk '$3~/^...s/' | nl

Esc #;

$ #find /{,usr/}{,s}bin/ -type f -ls | awk '$3~/^...s/' | nl
$ _

笔记

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

2:表示您需要按任意键才能获得“#” ,#因此您可能需要按Esc+或Shift+ +3AltShift3

(谢谢@vi)

定制化

在 Bash 中,您可以通过添加如下行来控制前缀.inputrc

set comment-begin "## "

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

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

"\e'": insert-comment
"\e#": nop

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

答案4

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

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

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

&&如果您希望执行第二条命令,您可能还想使用分号而不是分号仅有的 如果第一次成功。

相关内容