Please enable Javascript to view the contents

Linux基础-Readline命令行

 ·  ☕ 5 分钟

命令行编辑

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中记录切换目录之前的目录,且

Reference

Linux常用命令行小技巧: 全面+有深度, 有点乱

80%的人都不会的,15个Linux实用技巧: 清晰,量少

30个高效的Linux命令技巧: Bash语法

1.1 什么是Bash?

分享

Hex
作者
Hex
CloudNative Developer

目录