为了提高Linux下工作效率,自然而然的就变成了如何高效使用Bash的问题。虽然上一篇Shell下的一些特殊字符在使用的时候,能够一定程度上提高效率,后一篇关于Bash下的历史扩展也能很大程度提高效率,但Bash上的一些快捷键才是提高效率的最简单也是最直接方式。本文正是奔着这个目标来的!
bash 敲命令的快捷键
快捷键有个规律,Ctrl开头的快捷键一般是针对字符的,而Alt开头的快捷键一般是针对词的。
Bash下,如果使用的是shell脚本文件,快捷键不一定是一样的,有的时候会出现同一个快捷键有不同的表现,这种情况一般是由于Bash所处的模式不同而引起的,你可以通过set
命令来调整模式:
set -o emacs
##切到emacs模式
set -o vi
##切到vi模式
set -o
## 查看当前选项的设置状态
本文使用的是emacs模式
CTRL
=C
:这个键是指PC键盘上的Ctrl键ALT
=M
:这个键是PC键盘上的ALT键,如果你键盘上没有这个键,可以尝试使用ESC键代替SHIFT
=S
:此键是PC上的Shift键ESC
=E
:这个键是PC键盘上的ESC键,此键一般在键盘的左上角BACKSPACE
=DEL
:此键是是PC键盘上的Backspace键,一般位于主键盘区的右上角- 文中”[]”括住的为快捷键内容,”-“两边的内容是按住左边键,再按右边键获得,”,”逗号两边的内容是先按左边键,松开后再按右边键。如:[
CTRL
-v
]是表示按下Ctrl键之后,不要松开,再按下v键。 - 默认的情况下,快捷键的组成格式是:<
CTRL
|ALT
|ESC
>-[SHIFT
-]<char>
。即由Ctrl、Alt、Esc之一开头,中划线,Shift,中划线,和一个字符组成。其中,中括号内的Shift和”-“有时可省略。 - 默认情况下,快捷键只有最后一个为字符,其他的键值均为功能键
- 出现[
CTRL
-?]这类快捷键,由于”?”是需要使用Shift按键才能获得的字符,因此此类快捷键默认使用的是[CTRL
-SHIFT
-?]
常用快捷键
快捷键 | 说明 |
---|---|
定位相关 | |
CTRL -A |
将光标移到行首(在命令行下) |
CTRL -E |
将光标移动到行尾(在命令行下) |
ALT -F |
光标往前跳一个词(移动到光标所在词的末尾)。 |
ALT -B |
光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。 |
编辑相关 | |
CTRL -Y |
将之前已经清除的文本粘贴回来(主要针对CTRL -U 或CTRL -W 或CTRL -K )。 |
CTRL -W |
删除从在光标处往回的第一个空白符之间的内容。在某些设置里, CTRL -W 删除光标往后(回)到第一个非文字和数字之间的字符。 |
CTRL -U |
删除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL -U 会不以光标位置为参考而删除整行的输入。 |
CTRL -K |
删除从光标所在处到行尾的所有字符(在命令行下) |
ALT -D |
删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。 |
ALT -BASKSPACE |
删除光标所在位置到词开头的所有内容。 |
ALT -R |
取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。 |
特殊字符相关 | |
CTRL -V |
在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e ‘\x0a'; 和echo <CTRL-V><CTRL-J>; 这两种效果一样。这点功能在文本编辑器内非常有效。 |
CTRL -M |
回车(Carriage return)。 |
CTRL -I |
水平制表符。 |
CTRL -K |
垂直制表符(Vertical tab),(输入状态) |
CTRL -R |
回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)'': 输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。 |
CTRL -L |
跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和clear 命令一样。但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾。 |
程序相关
快捷键 | 说明 |
---|---|
CTRL -C |
中断,终结一个前台作业。 |
CTRL -Z |
暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。 用fg 恢复。 |
CTRL -S |
Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL -Q 。 |
CTRL -Q |
Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL -S 。 |
案例
避免重复输入文件名
touch /tmp/a-test-file-from-blog.useasp.net
## 如果不使用快捷键,文件名要重新输入
chmod u+x /tmp/a-test-file-from-blog.useasp.net
##使用快捷键
chmod u+x <ALT-.>
## 快捷键[M-.]自动会将上面的最后一个参数附加
自定义快捷键
使用bind
命令即可,Bash中的快捷键其实是Readline
来提供的,因此,这里快捷键的设置其实就是配置Readline
,Readline
中分两种快捷键,一种是Readline内部的函数快捷键,另外一种是执行Shell命令,设置的时候稍有不同:
##查看Readline中可以使用的函数名称
bind -l
##查看当前绑定的案件配置与其对应的功能
bind -v
##已经绑定的快捷键
bind -p
##绑定自定义执行命令shell命令的快捷键
bind -x '"\C-x\C-l":ls -al'
## 绑定后,按[C-x,C-L]就能执行ls -al
## 绑定内置函数功能
bind "\C-x":backword-delte-char
##这个是这行Readline库中的函数backword-delte-char
说明:
在配置文件中,
\C
代表CTRL
,\M
代表ALT
,\e
代表ESC
,\\
是反斜杠\
,\'
是单引号,\"
是双引号;如果要查看某一个功能键的字符序列可以通过[
CTRL
-V
]来实现,或者输入cat后回车,进入编辑中,直接按快捷键;配置文件中可能会使用八进制或者十六进制来表示字符;
为了能够让设置的快捷键永久有效,我们就需要将快捷键的配置写入文件。在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
TODO ‘\e[H‘ 到底表示什么
推荐的自定义
bind "\C-f":forward-word # 向前移动一个词 (以英文单词)
bind "\C-b":backward-word # 向后移动一个词
bind "\C-f":vi-fword # 向前移动一个词(以空格划分)
bind "\C-b":vi-bword # 向后移动一个词
全部快捷键
快捷键 | 快捷键说明 | |
---|---|---|
CTRL -A |
将光标移到行首(在命令行下) | |
CTRL -B |
退格 (非破坏性的),这个只是将光标位置往回移动一个位置。 | |
CTRL -C |
中断,终结一个前台作业。 | |
CTRL -D |
“EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL -D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL -D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。 |
|
CTRL -E |
将光标移动到行尾(在命令行下) | |
CTRL -F |
将光标向前移动一个字符(在命令行下) | |
CTRL -G |
BEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。 | |
CTRL -H |
擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。 | |
CTRL -I |
水平制表符。 | |
CTRL -J |
新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘\012’)或十六进制形式(‘\x0a’)。 | |
CTRL -K |
垂直制表符(Vertical tab)。在控制台或 xterm 窗口输入文本时,CTRL -K 会删除从光标所在处到行尾的所有字符。在脚本中,也可能表示为八进制形式(‘\013’)或十六进制形式(‘\x0b’)。在脚本中,CTRL -K 可能会有不一样的行为,下面的例子给出其不一样的行为:`#!/bin/bash## 一个CTRL-K垂直制表符的例子 var=$’\x0aBottom Line\x0bTop line\x0a’## 直接输出echo “$var”## 使用col来过滤控制字符echo “$var” |
col ## 上面的显示将会不一样 exit 0` |
CTRL -L |
跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和clear 命令一样。但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾。 |
|
CTRL -M |
回车(Carriage return)。 | |
CTRL -N |
擦除从history缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。 | |
CTRL -O |
产生一个新行(在命令行下)。 | |
CTRL -P |
从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL -N 都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL -N 是从起点开始由远及近(如果起点是历史命令的话)。 |
|
CTRL -Q |
Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL -S 。 |
|
CTRL -R |
回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)'': 输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。 |
|
CTRL -S |
Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL -Q 。 |
|
CTRL -T |
交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var; ,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr; 。 |
|
CTRL -U |
擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL -U 会不以光标位置为参考而删除整行的输入。 |
|
CTRL -V |
在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e ‘\x0a'; 和echo ; 这两种效果一样。这点功能在文本编辑器内非常有效。 |
|
CTRL -W |
当在控制台或一个xterm窗口敲入文本时, CTRL -W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL -W 删除光标往后(回)到第一个非文字和数字之间的字符。 |
|
CTRL -X |
在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。 | |
CTRL -Y |
将之前已经清除的文本粘贴回来(主要针对CTRL -U 或CTRL -W )。 |
|
CTRL -Z |
暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。 | |
CTRL -\ |
退出。和CTRL -C 差不多,也可能dump一个”core”文件到你的工作目录下(这个文件可能对你没用)。 |
|
CTRL -/ |
撤消操作,Undo。 | |
CTRL -_ |
撤消操作。 | |
CTRL -xx |
在行首和光标两个位置间进行切换,此处是两个”x”字符。 | |
ALT -B |
光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。 | |
ALT -F |
光标往前跳一个词(移动到光标所在词的末尾)。 | |
ALT -D |
删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。 | |
ALT -BASKSPACE |
删除光标所在位置到词开头的所有内容。 | |
ALT -C |
将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写)。 | |
ALT -U |
将光标所在位置到词尾的所有字母转为大写。 | |
ALT -L |
将光标位置到词尾的所有字母转为小写。 | |
ALT -R |
取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。 | |
ALT -T |
当光标两侧都存在词的时候,交换光标两侧词的位置。如:abc bcd -> bcd abc |
|
ALT -. |
使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念)。 | |
ALT -_ |
同ALT -. 。 |
|
ALT -数值 |
这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数。如:[ALT -10 ,k ]则光标位置会插入10个k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT --` 1 0, CTRL- D]则向 CTRL- D`默认方向相反(负数)的方向执行10次操作。 |
|
ALT -< |
移动到历史记录中的第一行命令。 | |
ALT -> |
移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空)。 | |
ALT -P |
从当前行开始向前搜索,有必要则向”上”移动,移动时,使用非增量搜索查找用户提供的字符串。 | |
ALT -N |
从当前行开始向后搜索,如果有必要向”下”移动,移动时,使用非增量搜索查找用户提供的字符串。 | |
ALT -CTRL -Y |
在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词)。如果有参数n,则插入前一个命令的第n个词(前一行的词编号从0开始,见历史扩展)。负的参数将插入冲前一个命令的结尾开始的第n个词。参数n通过M-No.的方式传递,如:[ALT -0 ,ALT -CTRL -Y ]插入前一个命令的第0个词(命令本身)。 |
|
ALT -Y |
轮询到删除环,并复制新的顶端文本。只能在yank[CTRL -Y ]或者yank-pop[M -Y ]之后使用这个命令。 |
|
ALT -? |
列出能够补全标志点前的条目。 | |
ALT -* |
把能够补全[ALT -? ]命令能生成的所有文本条目插入到标志点前。 |
|
ALT -/ |
试图对标志点前的文本进行文件名补全。[CTRL -X ,/ ]把标志点前的文本当成文件名并列出可以补全的条目。 |
|
ALT -~ |
把标志点前的文本当成用户名并试图进行补全。[CTRL -X ,~ ]列出可以作为用户名补全标志点前的条目。 |
|
ALT -$ |
把标志点前的文本当成Shell变量并试图进行补全。[CTRL -X ,$ ]列出可以作为变量补全标志点前的条目。 |
|
ALT -@ |
把标志点前的文本当成主机名并试图进行补全。[CTRL -X ,@ ]列出可以作为主机补全标志点前的条目。 |
|
ALT -! |
把标志点前的文本当成命令名并试图进行补全。进行命令名补全时会依次使用别名、保留字、Shell函数、shell内部命令,最后是可执行文件名。[CTRL -X ,! ]把标志点前的文本当成命令名并列出可补全的条目。 |
|
ALT -TAB |
把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全。 | |
ALT -{ |
进行文件名补全,把可以补全的条目列表放在大括号之间,让shell可以使用。 |