Linux命令之键绑定bind

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令之键绑定bind相关的知识,希望对你有一定的参考价值。

概述

简介

bind 是 Bash shell 的内置命令。您可以使用它来更改 bash 对在键盘上按下的键和键组合的响应方式。例如,我们按下 Ctrl+L 键,可以直接响应执行 clear 命令,而不是输入命令然后再回车执行。

通过这条命令,我们可以为一些常使用的命令设置按键或按键组合,即快捷键触发命令的方式,有效提高命令行中操作的效率。是很有用的一个命令。

bind 如何表示键

在使用 bind 命令之前,还得了解一些知识。如 bind 命令中如何表示键。

实际上,bind 使用特殊字符和文字字符串的方式来表示键盘键。其中特殊字符是:

特殊字符说明
\\C-表示按住 Ctrl 键,然后按破折号 - 后面的键。如 \\C-A 表示按 Ctrl+A 键。
\\e退出键。这用于其他绑定,例如元键(就是空格键旁边的键)。如 Alt 就是键盘上的元键。

我们可以通过运行 bind -P 命令来查看如何编码默认组合键:

如图我们可以看到 \\C-l 表示清除屏幕,即我们可以按 Ctrl + L 快捷键来快速清屏,而不需要输入 clear 命令了。

同样,我们还可以查看文件 /etc/inputrc 中列出来的绑定配置:

对于不常见的按键组合,你可以使用 Ctrl + V 来查找任何键码,如下。

查找键码

查找键码是很有用的,能帮助我们确定按键的键码,然后写 bind 命令。如果不确定特定组合键的代码是什么(如 F7 的键码是什么),那么可以在 bash 下先按 Ctrl + V,然后再按组合键,这个操作被称为 quoted-insert,它会显示你按下的键的代码。例如,如果先按 Ctrl + V,再按 F7,将看到如下:

^[[18~

注意,这里的 ^[ 是一个转义字符,所以我们才可以使用这个字符串来表示这个键码:

\\e[18~

如,我们先按 Ctrl + V,再按 Ctrl + D,结果会显示 ^D

语法

bind 命令的基本格式是:bind [选项] [参数]。即:

bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name]
     [-r keyseq] [-x keyseq:shell-command] 
     [keyseq:readline-function | readline-command]

其中各选项说明如下:

选项说明
-m keymap在当前命令序列的持续时间内使用 keymap 作为键映射方案。键映射的可能值(即 -m 参数后面可以跟下面这些值)为:- emacs:即 Emacs 风格的键映射,这是默认设置;- emacs-standard:与 emacs 相同; - emacs-meta:与 emacs 相同,具有备用绑定; emacs-ctlx:"Ctrl-X"样式的 Emacs 绑定; - vi:Vi 风格的键映射;- vi-move:与 vi 相同;- vi-command:与 vi 相同;- vi-insert:与 vi 类似,但具有用于插入文本的备用键映射。
-l列出所有可绑定编辑函数的名称,这些函数都是内置的。
-P列出所有可绑定函数的名称,以及它们的绑定(如果有)。
-p-P 相同,但以可用作 bind 命令输入的形式提供输出。
-S列出调用宏的键序列及其值。
-s-S 相同,但以可用作 bind 输入的形式提供输出。
-V列出在 bash 键绑定中使用的变量及其值。
-v-V 相同,但以可用作 bind 输入的形式提供输出。
-q function-name查询显示编辑函数 function-name 的键绑定。
-u function-name解除绑定到编辑函数 function-name 的所有键。
-r keyseq删除键序列 keyseq 的所有绑定。
-f filename从文件 filename 中读取键绑定,并将它们用作 bind 命令的输入。
-x keyseq:shell-command为键绑定命令。当 bash 收到键盘序列 keyseq 时, shell 命令 shell-command 将会被执行。
-X以适合输入到 bind 的形式列出所有由 -x 绑定的键序列。

使用

切换成 Vi 风格键映射

在bash中使用vi键映射,允许您像在 vi 中一样在命令行上操作文本。但我对 Vi 编辑器和 Emacs 编辑器都不熟,所以对这两种风格的切换具体有什么变化并不清楚。命令如下:

bind -m vi

列出所有可绑定的编辑函数

-l 选项会列出所有可绑定的编辑函数,这些函数都是内置的。命令如下:

bind -l

列出所有可绑定的编辑函数及绑定状态

-P 选项不仅列出了所有可绑定的编辑函数,还列出了它们的状态(是否已经被绑定)。命令如下:

bind -P

绑定文本到按键【★★★★】

可以将一段文本(如 "Hello World!")绑定到你键盘上的 F7 键(键码是 \\e[18~)。当你按下 F7 键后,将在命令行中进行插入,就像你输入了这段文本一样。命令如下:

bind '"\\e[18~":"Hello World!"'

注:冒号两边分别用双引号引起来,整个参数用单引号引起来。

绑定编辑函数

有那么多内置函数可以直接绑定使用。下面延时下绑定 kill-line 函数,该函数的作用是将所有文本从光标剪切到行尾。命令如下:

bind "\\C-k':kill-line

我们为这个函数绑定的键是 Ctrl + K,即按下 Ctrl + K 之后,就会将命令行上的所有文本从光标剪切到行尾。

当然我们还可以绑定其他函数,如 kill-whole-line 等。还有 yank 函数效果也不错,可以粘贴最后被剪切的文本,和 kill-line 函数配合使用,我们把它绑定到 Ctrl + Y 组合键上。

bind "\\C-y":yank

这样一个用于剪切,一个用于粘贴。

查看某编辑函数的绑定键

我们可以查看具体某个函数绑定了哪些键。如下:

# 语法
bind -q 函数名

# 比如我们查看 yank 函数绑定了哪些键
bind -q yank

移除键上的所有绑定

我们可以自己决定移除掉某个键或组合键上的所有绑定,无论绑定的是函数还是命令。基本格式如下:

# 语法
bind -r 键或组合键
# 示例,移除 Ctrl + Y 键上的所有绑定,选项是键码
bind -r "\\C-y"

绑定命令【★★★★★】

该种用法应该是最常用的,也是最有用的,可以为任何按键绑定自己想要的命令。基本格式如下:

# 语法,键码可查看前文如何获取,命令指shell命令
bind -x '"键码":"命令"'

# 示例
bind -x '"cc":"clear"'

在这里我为 C+C 组合键(即连续按两次键盘上的 C 键),就会自动执行 clear 命令,进行清屏操作。

当然我也可以为 Ctrl + L 按键绑定 ls -lh 命令,如:

bind -x '"\\C-L":"ls -lh"'

绑定 shell 脚本【★★★★★】

其实就是绑定命令的使用,但单独拿出来说,是因为绑定脚本很有用,我们可以直接按某个快捷键就能启动 shell 脚本。基本语法如下:

# 语法,键码可查看前文如何获取,脚本是指脚本的绝对路径
bind -x '"键码":"脚本"'

# 示例,restart.sh 是自定义的重启多台服务器的脚本
bind -x '"\\C-R":"/root/.ssh/restart.sh"'

查看自定义已绑定命令

我们可以查看自己通过 bind -x 命令绑定了哪些命令。基本格式如下:

bind -X


如果遇到 执行bind -X命令报错“-bash: bind: -X: invalid option“ 可参考原因。

从文件读取键绑定

适用于配置多个键绑定,将键绑定存储在文件中,然后从文件读取配置。格式如下:

bind -f 文件

如果想要测试,可以执行 bind -p > mybinds 将所有键绑定输出到名为 mybinds 的文件,格式可用作bind的输入。例如,您可以在文本编辑器中打开mybinds并更改绑定,然后保存文件。然后,您可以使用下一个命令应用您的更改。

我自定义的文件似乎并没有达到效果。

配置文件

知道配置文件 /etc/inputrc 是必要的,该文件是默认的系统范围的键绑定配置文件。

因为上面使用 bind 命令的绑定只对本地会话(session)有效,如果结束本次会话,那么进行的绑定设置就也会结束。所以如果想要永久有效,那么必须把它配置在 /etc/inputrc 文件中。

注:在使用 /etc/inpurc 配置文件时遇到一个问题,例如我要自定义绑定一个命令如:"\\C-K": "date",即按快捷键 Ctrl + K 时打印当前系统日期,但是命令行却会输出 "date" 字符串,而非命令的执行结果。未解决。

参考资料:

以上是关于Linux命令之键绑定bind的主要内容,如果未能解决你的问题,请参考以下文章

Linux 命令(232)—— bind 命令(builtin)

(转载)10个核心的Linux面试问题与答案

Redis之键(key)

Redis之键(key)

redis.conf详解之bind

linux网口绑定笔记-bind