Bash命令行快捷键与技巧
Bash命令行快捷键与技巧
引言
Bash默认使用 Emacs 的输入模式,使用 GNU Readline 的KeyBinding(注:Mysql命令行也是使用它)
如果想使用vi KeyBinding可以在启动时设置set -o vi
,通过命令可以看到具体当前设置情况:
[root@spirit1 ~]# set -o | grep -Ew "emacs|vi"
emacs on
vi off
vi mode简介,输入set -o vi
后直接进入了vi的INSERT模式,通过ESC
的方式进入COMMAND模式,ESC
后左右移动光标使用HL
,上下命令行是用JK
, 进入编辑模式使用i
, 查找历史 ESC, /
。更多vi mode内容可以参考 bash-vi-command-line-editing
因为Emacs和Vi都是神级编译器,熟悉他们将大大提高命令行操作效率,我对于他们也是刚刚入门,不过多介绍。
下面我主要介绍Emacs模式的相关内容
常用快捷键列表
注意剪切和删除的区别:剪切内容可以用于粘贴。
-
Ctrl+a
将光标定位到命令的开头 -
Ctrl+e
将光标定位到命令的结尾 -
Ctrl+u
剪切光标之前的内容,在输错命令或密码 -
Ctrl+k
与上一个快捷键相反,剪切光标之后的内容 -
Ctrl+l
清除屏幕,同clear -
Ctrl+w
剪切光标左边的参数(选项)或内容, 实际是以空格为单位向前剪切一个word,需要注意与ESC+Delete
的区别 -
Ctrl+b
当前光标往后移动 -
Ctrl+f
当前光标往前移动 -
Ctrl+d
删除当前光标字符 -
Ctrl+r,str
从bash history中搜索指定的字符串,也可以用于快速跳转命令行到指定字符串,具体操作方式为:输入快捷键 + 要搜索的字符串 -
Ctrl+/
撤销,测试发现同Ctrl+x, Ctrl+u
,Ctrl+_
两者的效果一样 -
Ctrl+y
粘贴所剪切的内容 -
Ctrl+p
前一个命令 -
Ctrl+n
后一个命令
使用到MetaKey的快捷键,以下MetaKey设置为ESC表示(Windows下XShell/SecureCRT、macOS的iTerm2默认都是ESC)
-
ESC+.
输入上一个命令的最后一个参数,与变量!$
效果一样 -
ESC+b
往后移动一个单词 -
ESC+f
往前移动一个单词 -
ESC+d
剪切光标后的一个单词 -
ESC+Delete
往前剪切一个单词,如:ls /0000.aaa_bbb=11ccc
执行4次的结果分别为ls /0000.aaa_bbb=
,ls /0000.aaa_
,ls /0000.
,ls /
部分快捷键如图:(此处的Alt对应ESC)
[图片上传失败...(image-fadcc1-1527382448837)]
暂不常用快捷键列表
-
Ctrl+h
命令删除光标前的字符 -
Ctrl+], c
从当前光标处向右定位到字符c处 -
ESC, Ctrl+], c
从当前光标向左定位到字符 c 处,具体操作为三步为先按下ESC,再同时按下Ctrl+]键,再按下需要定位的字符 -
Ctrl+g
从历史搜索模式退出,与ESC不同点在于:如果Ctrl+r
搜索到了,按ESC会使用搜索到命令,而Ctrl+g是会回到当前输入的命令,是真正的退出搜索 -
Ctrl+t
当前光表的字符和光标前一个字符位置替换 -
Ctrl+x, Ctrl+e
进入EDITOR模式编辑,EDITOR与命令行模式可以不一样,如set -o emacs; export EDITOR=vi
-
ESC+l
当前光标开始的单词转为小写 -
ESC+u
当前光标开始的单词转为大写
其他未知的快捷键
-
ESC+n, str
在命令行中出现一个:
,向前搜索,非递增顺序 -
ESC+p, str
反向搜索,不是递增顺序,输入要查找的字符串,然后按下 Enter,执行搜索
高效操作历史命令(强大)
先看个例子:
[root@spirit1 ~]# touch file1 file2 file3 # 生成文件
[root@spirit1 ~]# mkdir !!*:gs/file/dir # 替换上一个命令中所有参数file字符为dir,若不加*则是整行命令
mkdir dir1 dir2 dir3
操作历史命令分为三步:
-
首先从历史命令列表中选择某条命令, 被选择到的命令被称作 事件(event) (对应上面的!!)
-
再从选择好的事件中选择一部分单词(words), 事件中的每个单词以空格分割(对应上面的*)
-
最后对选择好的一部分单词进行修改(Modifiers)
更多内容见Bash History Expansion, 感叹号提高Bash下效率——历史扩展(bang命令)
典型场景
跳到命令行中间指定为执行位置进行编辑
如 [root@spirit1 ~]# ls /test/abcdef /test/abcdef
当前命令行下想要修改中间的test
,一种方式是使用LeftArrow按字符移动亦或使用Alt+B按单词移动,更快速的方式时使用Ctrl+r,str
快速定位。
如果想定位到右边的test:
-
Ctrl+r
进入搜索模式 -
test
跳转到当前命令行的最左边test,如果当前命令行没有
如果想定位到左边的test,只需要再按一次 Ctrl+r
即可
创建一个目录并切换到新目录
操作步骤
-
mkdir /tmp/test
-
cd, ESC+.
快速删除到指定位置
比如先测试了 export PYTHONPATH=./eggs/hiredis-0.2.0-py2.7-linux-x86_64.egg/ && python test_pythonpath.py
,然后需要测试 PYTHONPATH=''
的场景,此时需要先删除 ./eggs/hiredis-0.2.0-py2.7-linux-x86_64.egg/
,但是 CTRL+W
和 ALT+DELETE
都不是很合适,一个删除太多,一个需要多次操作。
技巧(Tricks And Tips)
-
Ctrl+s, Ctrl+q
暂停当前屏幕输出,并恢复屏幕输出,常用于日志刷屏的时需暂停下回看之前日志的情形 -
!!
表示上一个命令的变量,常用一个命令需要较高权限, 如执行yum install gcc
发现没有权限后,再次执行使用sudo !!
-
!$
表示上一个命令最后一项 -
alias gerp=grep
输错命令使用alias来避免重输 -
yes | command_or_script
有些命令需要确认,而且是输入Yes的,如cp
覆盖已有文件时 -
!ls
执行最近一次以ls开头的命令 -
!*
重复执行上一个命令,但是不含上一个命令的最后一项 -
ESC, #
或者ESC+#
注释当前输入命令(在命令前面家#
),用于保存临时不想执行的命令 -
^abc
删除上一条命令中的abc,只删除最左边的一个字符串,并执行 -
^abc^123
替换上一个命令中abc
字符串为123
,从最左边开始替换一个指定字符串,并执行(如何替换所有的?)
To Be Continued
这里的很多技巧都是利用Emacs的知识点,因此深入了解Emacs有助于更好的使用Bash