Linux命令之键绑定bind
  TEZNKK3IfmPf 2023年11月13日 39 0

概述

简介

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

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

bind 如何表示键

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

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

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

我们可以通过运行 bind -P 命令来查看如何编码默认组合键:
Linux命令之键绑定bind
如图我们可以看到 \C-l 表示清除屏幕,即我们可以按 Ctrl + L 快捷键来快速清屏,而不需要输入 clear 命令了。

同样,我们还可以查看文件 /etc/inputrc 中列出来的绑定配置:
Linux命令之键绑定bind
对于不常见的按键组合,你可以使用 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

Linux命令之键绑定bind

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

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

bind -P

Linux命令之键绑定bind

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

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

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

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

Linux命令之键绑定bind

绑定编辑函数

有那么多内置函数可以直接绑定使用。下面延时下绑定 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

Linux命令之键绑定bind

移除键上的所有绑定

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

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

Linux命令之键绑定bind

绑定命令【★★★★★】

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

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

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

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

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

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

Linux命令之键绑定bind

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

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

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

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

Linux命令之键绑定bind

查看自定义已绑定命令

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

bind -X

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

从文件读取键绑定

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

bind -f 文件

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

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

配置文件

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

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   51   0   0 linux服务器
  TEZNKK3IfmPf   2024年05月31日   29   0   0 linux服务器centos
  TEZNKK3IfmPf   2024年05月31日   29   0   0 linuxbind
  TEZNKK3IfmPf   2024年05月31日   39   0   0 linuxshell
TEZNKK3IfmPf