命令行编辑
GNU命令行编辑由
readline
库提供,使用 readline 的程序现在主要有 Bash, GDB,ftp 。 当使用交互式shell时,命令行编辑被默认启用,除非在shell调用时提供–noediting选项。
1. 简介 GNU readline库
readline 是一个 GNU 库,它提供了一系列函数,用于处理文本输入行的读取和编辑,以及对这些行的进行历史和补全功能。使用 readline 的程序现在主要有 Bash, GDB,ftp 等
readline默认的快捷键为Emacs-style
(Esc Meta Alt Ctrl Shift), 可通过man readline
查看默认的Emacs-style
快捷键。
2. 键盘绑定
readline默认快捷键为
Emacs-style
(set -o emacs
), 可以使用set -o vi
使用vi-style
风格的快捷键,还可通过set +o vi
进行禁用。
实战
3. 常用Emacs-style
快捷键
可通过
man readline
查看默认的Emacs-style
键盘绑定。
3.1 命令行编辑:光标移动
3.1.1 行首、行尾
在命令行中输入一长串命令时,可以按下
Ctrl + a
来快速将光标移动到命令的开头,以便编辑。Ctrl
+a
: 移动到命令行的开头。 ==Home键
==alt
+shift
+b
在命令行中输入一长串命令后,想要在最后添加内容时,可以按下Ctrl + e
将光标快速移到命令的末尾。Ctrl
+e
: 移动到命令行的结尾。 ==End键
==alt
+shift
+f
3.1.2 前移、后移 1字符
Ctrl
+ b
: 向左移动1个字符。 == 方向左键<-
Ctrl
+ f
: 向右移动1个字符。 == 方向右键->
3.1.3 前移、后移 1单词
Ctrl
+ 方向左键<-
: 向左移动1个单词。== alt
+ b
(back)Ctrl
+ 方向左键->
: 向右移动1个单词。== alt
+ f
(forward)
3.1.4 返回上次光标位置
Ctrl + x + x:光标在命令行中光标最后两次出现的位置间进行切换
3.2 命令行编辑:删除
3.2.1 删除至行首、删除至行尾
Ctrl
+ u
删除至行首。
Ctrl
+ k
删除至行尾。
3.2.2 删除前一项
Ctrl
+ w
删除删除光标处左边一个单词,或至单词首的内容。
3.2.3 删除后一项
Alt
+ d
: 删除光标处右边一个单词,或至单词末的内容(可能冲突,不建议)。
3.2.4 删除前一字符
Ctrl
+ h
: 删除光标处左边一个字符(==Backspace键)。
3.2.5 删除后一字符
Ctrl
+ d
: 删除光标处右边一个字符(==delete键)。
3.2.6 插入上次删除的内容
Ctrl
+ y
: 将上一次删除的内容插入到光标处。(光标不移动,等同于撤销操作)。
3.3 命令行编辑:撤销
3.3.1 撤销修改
Ctrl
+ shift
+ -
(即 Ctrl
+ _
):撤销,即恢复上一次操作,可撤销多次。
注意,这个快捷根据自己系统设定不一样,有的Ctrl+shift+-
是撤销,Ctrl+-
是命令行字体变小,而有的系统设置刚好相反。
3.4 命令行编辑:屏幕调整
3.4.1 字体变小
Ctrl
+-
:命令行字体变小,注意看上面撤销修改Ctrl+shift+-
的说明。
3.4.2 字体变大
Ctrl
+shift
++
:命令行字体变大。有的系统设置是Ctrl
++
,ctrl
和+
的组合是命令行字体变大。
3.4.3 清屏
Ctrl
+l
: 清屏,但是当前命令行内容保留
3.4.4 锁定
Ctrl
+s
: 锁定命令行
3.4.5 解锁
Ctrl
+Q
: 解锁命令行
3.5 命令行编辑:历史命令
Ctrl
+ r
:查看历史命令,需要输入命令的起始字母,剩下的部分自动补全。
Ctrl
+ p
:显示上一条命令(==向上箭头)。
Ctrl
+ n
:显示下一条命令(==向下箭头)。
history
:查看历史命令,按顺序全部显示出来,有对应的编号。
3.6 程序相关
Ctrl
+ c
:中断并杀死,程序终止。
Ctrl
+ z
:中断程序放到后台,唤醒使用fg
命令。
Ctrl
+ s
:挂起,类似于暂停。
Ctrl
+ q
:退出挂起,类似于继续,发现按键盘任意按键也可以退出挂起。
3.7 命令行编辑:特殊符号(快速引用)
快速引用之前命令,以及结果
shell standard special parameters
!开头都是基于history的扩展
$开头都是shell中的参数
3.7.1 命令执行
!!
:表示上一条命令的整个内容。
执行docker images
后,再执行!!
等同于docker images
$_
:表示上一条命令的最后一个参数。$?
:表示上一条命令的退出状态(返回码,如果命令成功执行,$? 的值为 0,否则为非零值)。!$
:前一条命令的最后一个参数。(上一命令存在重定向时,与$_
会出现不一致)
执行ls /var/log/syslog
后,再执行less !$
等同于less /var/log/syslog
!num
:history历史命令列表中第num条命令的整个内容。!?string?
:history列表中含有string字符串的最新命令的整个内容。
3.7.2 参数引用
$*
和$@
:表示所有参数的值,区别在于对待引号的方式不同。$*
:将所有参数作为一个单词处理,不会保留参数中的引号。$@
:将每个参数视为一个独立的单词,保留参数中的引号。
$0
:表示当前正在执行的脚本或命令的名称。$1,$2,$3...
: 脚本的入参,分别对应第一个参数、第二个参数。。。
3.7.3 进程信息
$!
:表示在后台运行的最后一个进程的进程号(PID)。$$
:表示在后台运行的最后一个进程的进程号(PID)。
3.7.4 目录切换
3.7.4.1 返回主目录
3.7.4.1 返回上个工作目录
当执行
cd <path>
后,会在环境变量OLDPWD
中记录切换目录之前的目录,且