命令行编辑
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中记录切换目录之前的目录,且