概述
简介
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"
字符串,而非命令的执行结果。未解决。