Bash 内置了 Readline 库,具有这个库提供的很多“行操作”功能,比如命令的自动补全,可以大大加快操作速度。
这个库默认采用 Emacs 快捷键,也可以改成 Vi 快捷键。
$ set -o vi
下面的命令可以改回 Emacs 快捷键。
$ set -o emacs
如果想永久性更改编辑模式(Emacs / Vi),可以将命令写在~/.inputrc文件,这个文件是 Readline 的配置文件。
~/.inputrc
set editing-mode vi
本章介绍的快捷键都属于 Emacs 模式。Vi 模式的快捷键,读者可以参考 Vi 编辑器的教程。
Bash 默认开启这个库,但是允许关闭。
$ bash --noediting
上面命令中,--noediting参数关闭了 Readline 库,启动的 Bash 就不带有行操作功能。
--noediting
Readline 提供快速移动光标的快捷键。
Ctrl + a
Ctrl + b
Ctrl + e
Ctrl + f
Alt + f
Alt + b
上面快捷键的 Alt 键,也可以用 ESC 键代替。
Ctrl + l快捷键可以清除屏幕,即将当前行移到屏幕的第一行,与clear命令作用相同。
Ctrl + l
clear
下面的快捷键可以编辑命令行内容。
Ctrl + d
Ctrl + w
Ctrl + t
Alt + t
Alt + l
Alt + u
使用Ctrl + d的时候,如果当前行没有任何字符,会导致退出当前 Shell,所以要小心。
剪切和粘贴快捷键如下。
Ctrl + k
Ctrl + u
Alt + d
Alt + Backspace
Ctrl + y
同样地,Alt 键可以用 Esc 键代替。
命令输入到一半的时候,可以按一下 Tab 键,Readline 会自动补全命令或路径。比如,输入cle,再按下 Tab 键,Bash 会自动将这个命令补全为clear。
cle
如果符合条件的命令或路径有多个,就需要连续按两次 Tab 键,Bash 会提示所有符合条件的命令或路径。
除了命令或路径,Tab 还可以补全其他值。如果一个值以$开头,则按下 Tab 键会补全变量;如果以~开头,则补全用户名;如果以@开头,则补全主机名(hostname),主机名以列在/etc/hosts文件里面的主机为准。
$
~
@
/etc/hosts
自动补全相关的快捷键如下。
Alt + ?
Alt + /
Ctrl + x /
Ctrl + x
/
Alt + !
Ctrl + x !
!
Alt + ~
Ctrl + x ~
Alt + $
Ctrl + x $
Alt + @
Ctrl + x @
Alt + *
Alt + Tab
.bash_history
上面的Alt键也可以用 ESC 键代替。
Alt
Bash 会保留用户的操作历史,即用户输入的每一条命令都会记录。退出当前 Shell 的时候,Bash 会将用户在当前 Shell 的操作历史写入~/.bash_history文件,该文件默认储存500个操作。
~/.bash_history
环境变量HISTFILE总是指向这个文件。
HISTFILE
$ echo $HISTFILE /home/me/.bash_history
有了操作历史以后,就可以使用方向键的↑和↓,快速浏览上一条和下一条命令。
↑
↓
下面的方法可以快速执行以前执行过的命令。
$ echo Hello World Hello World $ echo Goodbye Goodbye $ !e echo Goodbye Goodbye
上面例子中,!e表示找出操作历史之中,最近的那一条以e开头的命令并执行。Bash 会先输出那一条命令echo Goodbye,然后直接执行。
!e
e
echo Goodbye
同理,!echo也会执行最近一条以echo开头的命令。
!echo
echo
$ !echo echo Goodbye Goodbye $ !echo H echo Goodbye H Goodbye H $ !echo H G echo Goodbye H G Goodbye H G
注意,!string语法只会匹配命令,不会匹配参数。所以!echo H不会执行echo Hello World,而是会执行echo Goodbye,并把参数H附加在这条命令之后。同理,!echo H G也是等同于echo Goodbye命令之后附加H G。
!string
!echo H
echo Hello World
H
!echo H G
H G
最后,按下Ctrl + r会显示操作历史,可以用方向键上下移动,选择其中要执行的命令。也可以键入命令的首字母,Shell 就会自动在历史文件中,查询并显示匹配的结果。
Ctrl + r
history命令能显示操作历史,即.bash_history文件的内容。
history
$ history ... 498 echo Goodbye 499 ls ~ 500 cd
使用该命令,而不是直接读取.bash_history文件的好处是,它会在所有的操作前加上行号,最近的操作在最后面,行号最大。
通过定制环境变量HISTTIMEFORMAT,可以显示每个操作的时间。
HISTTIMEFORMAT
$ export HISTTIMEFORMAT='%F %T ' $ history 1 2013-06-09 10:40:12 cat /etc/issue 2 2013-06-09 10:40:12 clear
上面代码中,%F相当于%Y - %m - %d,%T相当于%H : %M : %S。
%F
%Y - %m - %d
%T
%H : %M : %S
只要设置HISTTIMEFORMAT这个环境变量,就会在.bash_history文件保存命令的执行时间戳。如果不设置,就不会保存时间戳。
如果不希望保存本次操作的历史,可以设置环境变量HISTSIZE等于0。
HISTSIZE
export HISTSIZE=0
如果HISTSIZE=0写入用户主目录的~/.bashrc文件,那么就不会保留该用户的操作历史。如果写入/etc/profile,整个系统都不会保留操作历史。
HISTSIZE=0
~/.bashrc
/etc/profile
如果想搜索某个以前执行的命令,可以配合grep命令搜索操作历史。
grep
$ history | grep /usr/bin
上面命令返回.bash_history文件里面,那些包含/usr/bin的命令。
/usr/bin
操作历史的每一条记录都有编号。知道了命令的编号以后,可以用感叹号 + 编号执行该命令。如果想要执行.bash_history里面的第8条命令,可以像下面这样操作。
感叹号 + 编号
$ !8
history命令的-c参数可以清除操作历史。
-c
$ history -c
下面是一些与操作历史相关的快捷键。
Ctrl + p
Ctrl + n
Alt + <
Alt + >
Ctrl + o
感叹号!的快捷键如下。
!!
!n
n
!-n
string
!?string
^string1^string2
string1
string2
Ctrl + j
Ctrl + m
Ctrl + v
^M
Ctrl + [
Alt + .
Alt + _
上面的Alt + .快捷键,对于很长的文件路径,有时会非常方便。因为 Unix 命令的最后一个参数通常是文件路径。
$ mkdir foo_bar $ cd #按下 Alt + .
上面例子中,在cd命令后按下Alt + .,就会自动插入foo_bar。
cd
foo_bar
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8