我知道我可以Up用来遍历先前的命令。运行最后一个命令只需涉及Up+ Enter。但是,由于我在中花费了大量时间,因此我在考虑购买Happy Hacking Keyboardvim。
该键盘没有箭头键,我知道如何获得这种行为的唯一方法是按Ctrl+ R并开始重复我以前的命令。
在没有箭头键的情况下,有没有一种简单的方法可以在UNIX终端中模拟Up+ Enter?
我知道我可以Up用来遍历先前的命令。运行最后一个命令只需涉及Up+ Enter。但是,由于我在中花费了大量时间,因此我在考虑购买Happy Hacking Keyboardvim。
该键盘没有箭头键,我知道如何获得这种行为的唯一方法是按Ctrl+ R并开始重复我以前的命令。
在没有箭头键的情况下,有没有一种简单的方法可以在UNIX终端中模拟Up+ Enter?
Answers:
随着csh或任何shell执行csh样的历史替换(tcsh,bash,zsh):
!!
然后Enter。
或交替:
!-1
然后Enter。
或Ctrl+ P,Enter
另外,请注意,!!并且!-1在执行之前(可能为时已晚),并且不会为您自动展开。
如果使用bash,就可以把bind Space:magic-space进入~/.bashrc,然后按Space该命令后,将内嵌自动扩展它们,让您在执行之前对其进行检查。这对于前一段时间运行的命令的历史记录扩展特别有用,例如,!echo将拉出最后一个以开头的命令echo。借助魔术空间,您可以在命令运行之前对其进行预览。
这相当于bindkey ' ' magic-space在tcsh或中进行zsh。
magic-space那是一个不错的选择!
histverify选项,shopt该选项将导致readline进行历史记录扩展,但在首次按下Enter键时不执行命令。这将使您评估结果并决定是否要运行该结果。
!!是使用in-place扩展。例如sudo !!。
大多数具有命令行编辑功能的外壳程序都支持Emacs按键绑定。(一小部分)
Up Ctrl+P
Down Ctrl+N
Left Ctrl+B
Right Ctrl+F
Home Ctrl+A
End Ctrl+E
Delete Ctrl+D
另外,您可以通过添加set -o vi到Shell启动文件(例如,~/.bashrc)来将Shell 设置为使用vi命令编辑模式。然后,例如,您可以
!!)。减号键-也可以用作“上移”命令。!-12)。vi命令模式,所以你需要使用vi编辑命令(例如I,A,C,R,或相应的小写字母之一)实际上从历史添加到命令。sudo !!。!-2:- !$。(不幸的是,它似乎不支持命名缓冲区。)vi窍门很棒!!!
delete在岩组CTL + U
当然!既然您习惯了vi键盘绑定,为什么不配置您的外壳来响应它们呢?为此bash,请将其放入您的~/.inputrc:
set editing-mode vi
正在运行的bash实例将不会重新读取文件,因此请注销并重新登录。
zsh甚至会发现这个要求:如果没有你的启动脚本迫使编辑模式下使用的一种方式或其他bindkey 和,如果你的$EDITOR检测环境变量包含vi,那么它会自动启用vi键绑定。如果您需要强制执行此操作,请将其放入您的~/.zshrc:
bindkey -v
此后,使用ESC照常进入命令行和k及j向向上和向下移动。
还:大多数外壳程序中的默认外壳程序绑定是emacs绑定,因此实际上Crtl-P并且Ctrl-N应该已经可以工作而无需更改任何内容。
我发现我经常需要以超级用户身份重做命令,所以
sudo !!
重做上一个命令,就像我记得首先键入一样sudo。
该ksh外壳具有默认别名r,该别名重复最近的命令。它必须绑定到fc -s:
alias r='fc -s'
有趣的是,内置bash文档fc(help fc,以及手册本身)甚至提到了这一点,但它不是该shell中的默认别名:
与此配合使用的有用别名是
r='fc -s',这样,键入r cc将以最后一个命令开始运行最后一个命令cc,键入将r重新执行最后一个命令。
在中bash,即使您已使用关闭了历史记录扩展,这也将起作用set +H。
在zsh外壳程序中,有一个r内建文件,据证明与相同fc -e -。
该fc实用程序是POSIX标准实用程序。
tl; dr !!仅将最后一个命令附加到当前命令之后。<backtick>!!<backtick> 执行最后一个命令,并将输出附加到当前命令。
实际上有2个变体:
让我向您展示2个示例:
例子1
$ mkdir /test
mkdir: /test: Permission denied
$ sudo !!
sudo mkdir /test
Password:
如您在上面看到的,我正在执行一个命令,实际上只是在追加最后一个命令。
另一种变化
例子2
$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt
$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"
vi `!!`。非常有用
您可以!n在终端中执行第n条命令。其中“ n”是history命令的行号。
!?到最后一个命令?您确定您没有将其混淆!!(其他答案已对此进行了说明)?