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 while
or for
loop, hit CTRL- C,它将命令添加到历史记录中而不执行它并清除该行,因此您可以在以下情况下使用 shell 的历史记录机制调用它您已准备好使用它。
Emm*_*uel 32
注释该行,然后按 Enter
Ctrl——A
#
Enter
所以你把这条线保留在历史中
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:#手段无论你需要按下得到一个“#”,所以你可能必须按Esc再Shift+3或Alt+ 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
与zsh
在emacs模式,Alt+Q或Ctrl+Q(push-line
插件),推压在堆栈上的当前的命令行(保存供以后)并清除当前输入缓冲器。
然后您可以输入另一个命令,然后返回最后一个推送的命令(从该堆栈中弹出)。
如果您特别想保存命令,我通常会按照 Emmanuel 的建议进行操作。但如果只想在当前命令之前输入另一个命令,则无需保存。转到该行的开头,输入其他命令并添加分号。
Ctrl——A cp f.txt /input/file.txt ;
Enter
这应该按照您想要的顺序执行这两个命令。更重要的是,它将一起保存在您的历史记录中,因此如果将来您想再次执行第二个命令并使用Ctrl-到达它R,您将在那里看到第一个命令并提醒它必须在之前执行(在您总是需要同时执行两者的情况)。
&&
如果您希望仅 在第一个命令成功时才执行第二个命令,您可能还想使用分号代替分号。
归档时间: |
|
查看次数: |
12431 次 |
最近记录: |