每个 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中拉出)以取回原始命令。
或者,如果您处于嵌套命令(例如while
orfor
循环)中,则这特别有用,点击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,你会在那里看到第一个命令,并提醒它必须在之前执行(在在这种情况下,您总是需要同时执行两者)。
&&
如果您希望执行第二条命令,您可能还想使用分号而不是分号仅有的 如果第一次成功。