Shell 快捷键¶
命令行用户在使用命令行时并不喜欢敲入太多文本,所以命令中才会有 cp、ls、mv 和 rm 那么多缩写的命令名。命令行最大的目标之一就是减少操作(省事),用最少的击键次数执行最多的任务。为了提高命令行下的工作效率,使用一些快捷键是提高效率的最简单也是最直接方式。
Bash 使用了一个名为 Readline 的库(供不同的应用程序共享使用的线程集合),来实现命令行编辑。例如:用箭头键来移动光标,此外还有许多特性。
注意
Shell 中有两种命令行编辑的模式,即 vi 模式和 Emacs 模式(Bash 默认使用的是 Emacs 模式)。在两种模式中使用不同的快捷键操纵在命令行中键入的内容,包括使用历史列表和自动补全的功能。
如果快捷键不能使用,可以将命令行编辑模式设置为 Emacs 默认值。
[Linux]$ set -o emacs
控制 Shell 进程¶
按键 | 作用 |
---|---|
<Ctrl-S> | 挂起终端(有点像卡住了,但输入的命令还会执行) |
<Ctrl-Q> | 恢复挂起的终端(恢复输入状态,并输出挂起时执行的命令) |
<Ctrl-C> | 终止前台命令的执行 |
<Ctrl-D> | 发送表示标准输入结束的 EOF 信号。经常用于退出程序或 Shell。 |
<Ctrl-Z> | 暂停前台命令的执行,并放入后台保存 |
移动光标¶
按键 | 作用 |
---|---|
<Ctrl-P> | 上一条命令(相当于 <Up>) |
<Ctrl-N> | 下一条命令(相当于 <Down>) |
<Ctrl-B> | 光标左移一个字符(相当于 <Left>) |
<Ctrl-F> | 光标右移一个字符(相当于 <Right>) |
<Ctrl-A> | 移动光标到行首 |
<Ctrl-E> | 移动光标到行尾 |
剪切和粘贴¶
Readline 的文档使用术语 killing 和 yanking 来指代我们平常所说的剪切和粘贴。剪切的本文存储在一个叫做剪切环(kill-ring)的缓冲区中。
按键 | 作用 |
---|---|
<Ctrl-H> | 删除一个字符(相当于 <Backspace>) |
<Ctrl-U> | 剪切从光标处到行首的字符 |
<Ctrl-K> | 剪切从光标处到行尾的字符 |
<Ctrl-W> | 剪切从光标处到词尾的字符 |
<Ctrl-Y> | 粘贴文本到光标处 |
<Alt-R> | 清空行(如果命令是从历史列表中复制的,则会恢复到原始命令) |
其它常用功能¶
按键 | 作用 |
---|---|
<Ctrl-L> | 清空屏幕(相当于 clear 命令) |
<Ctrl-R> | 反向递增搜索历史列表中的命令 |
<Ctrl-J> | 换行符(相当于 <Enter> ) |
<Ctrl-M> | 返回符(相当于 <Enter> ) |
<Ctrl-V> | 插入控制字符 |
<Ctrl-T> | 互换光标处和光标前面的字符位置 |
提示
在开发 Unix 时因为成本的原因,使用了电传打字机作为终端。在电传打字机上执行回车时,包含两种操作,首先将托盘返回到最左边的位置上(即 CR 码返回信号),然后将打印纸向上移动一行(即 LF 码换行信号)。
在终端快捷键中,<Ctrl-M> 发送返回信号,<Ctrl-J> 发送换行信号。在终端执行命令时,软件会把 CR 和 LF 信号转换为 CR+LF 回车信号。
自定义快捷键¶
使用 bind
命令可以自定义快捷键,Bash 中的快捷键其实是 Readline 来提供的,因此,这里快捷键的设置其实就是配置 Readline,Readline 中分两种快捷键,一种是 Readline 内部的函数快捷键,另外一种是执行 Shell 命令,设置的时候稍有不同:
# 查看 Readline 中可以使用的函数名称
bind -l
# 已经绑定的快捷键
bind -p
# 自定义快捷键
# 绑定后,按[C-x,C-L]就能执行ls -al
bind -x '"/C-x/C-l":ls -al'
这种设置只针对当前的会话有效,一旦会话丢失,设置的快捷键就会丢失。为了让设置的快捷键永久有效,需要编辑配置文件,在 Linux 系统中,有两个配置文件(全局的和用户的),全局的配置文件是 /etc/inputrc
,而用户的配置文件在家目录下 ~/.inputrc
。inputrc 文件的大概样子像下面这样:
# 本例来自 CentOS6.4
$if mode=emacs
# for linux console and RH/Debian xterm
"/e[1~": beginning-of-line
"/e[4~": end-of-line
# commented out keymappings for pgup/pgdown to reach begin/end of history
#"/e[5~": beginning-of-history
#"/e[6~": end-of-history
"/e[5~": history-search-backward
"/e[6~": history-search-forward
"/e[3~": delete-char
"/e[2~": quoted-insert
"/e[5C": forward-word
"/e[5D": backward-word
"/e[1;5C": forward-word
"/e[1;5D": backward-word
# for rxvt
"/e[8~": end-of-line
"/eOc": forward-word
"/eOd": backward-word
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"/eOH": beginning-of-line
"/eOF": end-of-line
# for freebsd console
"/e[H": beginning-of-line
"/e[F": end-of-line
$endif
在配置文件中,/C
代表 <Ctrl> 键,/M
代表 <Alt> 键,/e
代表 <Esc> 键,//
代表反斜杠,/'
代表单引号,/"
代表双引号;
可以通过 <CTRL-V> 来查看某一个功能键的字符序列,或者输入 cat 后回车,进入编辑中,直接按快捷键。配置文件中可能会使用八进制或者十六进制来表示字符。