我知道我可以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
命令的行号。
!?
到最后一个命令?您确定您没有将其混淆!!
(其他答案已对此进行了说明)?