linux bind命令

bind命令是bash shell的内置命令,用于显示和设置命令行编辑器的键盘快捷键。它允许用户自定义键盘按键对应的操作,提高命令行操作效率。

语法格式

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

命令功能

  • 显示当前键盘绑定设置
  • 绑定键盘序列到shell函数
  • 绑定键盘序列到外部命令
  • 加载readline配置文件
  • 管理命令行编辑快捷键

📝 重要说明

  • bind是bash的内置命令,不是独立程序
  • 绑定只在当前shell会话中有效(除非添加到配置文件)
  • 基于GNU Readline库,用于命令行编辑
  • 不同键映射(keymap)有不同的绑定:emacs(默认)、vi-insert、vi-command

常用键序列表示

表示法 说明
\C-x Control+X(Ctrl+X)
\M-x Meta+X(通常是Alt+X或Esc X)
\e Escape键
\t Tab键
\n 换行(Enter/Return)
\r 回车
\b 退格(Backspace)
\f 换页
\d 删除(Delete)
\s 空格
\\ 反斜杠
\" 双引号
\' 单引号
\C-\\ Control+\
\C-] Control+]

参数说明

参数 说明
-m keymap 指定键映射:emacs(默认)、vi-insert、vi-command
-l 列出所有Readline函数名称
-p 以可重用的格式显示当前绑定
-P 列出当前绑定的函数名称
-s 显示绑定到宏的键序列和它们输出的字符串
-S 显示绑定到宏的键序列
-v 显示Readline变量名和值
-V 显示当前Readline变量名和值
-q function 查询指定函数绑定的键序列
-u function 取消指定函数的所有绑定
-r keyseq 移除指定键序列的绑定
-f filename 从指定文件读取键绑定
-x keyseq:shell-command 绑定键序列到shell命令
keyseq:function-name 绑定键序列到Readline函数
X 列出所有绑定到shell命令的键序列

常用示例

示例1:显示所有当前绑定

查看当前所有的键盘绑定:

# 显示当前所有绑定(emacs键映射)
$ bind -p

# 显示为可读格式
$ bind -P

# 显示所有绑定到shell命令的键序列
$ bind -X

bind -p 输出示例:

"\C-g": abort
"\C-x\C-g": abort
"\e\C-g": abort
"\C-j": accept-line
"\C-m": accept-line
# ... 更多绑定

示例2:查询特定函数的绑定

查询特定Readline函数绑定的键:

# 查询accept-line函数(接受当前行)的绑定
$ bind -q accept-line
accept-line can be invoked via "\C-j", "\C-m".

# 查询backward-delete-char函数(向后删除字符)
$ bind -q backward-delete-char
backward-delete-char can be invoked via "\C-h", "\C-?".

# 查询kill-line函数(删除到行尾)
$ bind -q kill-line
kill-line can be invoked via "\C-k".

示例3:创建自定义快捷键

绑定键序列到Readline函数:

# 绑定Alt+L到清屏函数(clear-screen)
$ bind '"\el": clear-screen'

# 使用:按Alt+L清屏
# 测试:输入一些文本,然后按Alt+L

# 绑定Control+T到反向交换字符(transpose-chars)
$ bind '"\C-t": transpose-chars'

# 绑定Alt+方向键到移动词
$ bind '"\e[1;5C": forward-word'   # Ctrl+右箭头
$ bind '"\e[1;5D": backward-word'  # Ctrl+左箭头
$ bind '"\e[1;3C": forward-word'   # Alt+右箭头
$ bind '"\e[1;3D": backward-word'  # Alt+左箭头

示例4:绑定键序列到shell命令

使用-x参数绑定键到外部命令:

# 绑定Alt+P到显示当前目录
$ bind -x '"\ep":"pwd"'

# 使用:按Alt+P执行pwd命令

# 绑定Alt+G到显示git状态
$ bind -x '"\eg":"git status"'

# 绑定Alt+D到显示日期
$ bind -x '"\ed":"date"'

# 绑定Alt+C到清屏并列出文件
$ bind -x '"\ec":"clear; ls -la"'

示例5:取消绑定

移除已有的键绑定:

# 移除Alt+L的绑定
$ bind -r "\el"

# 移除所有clear-screen函数的绑定
$ bind -u clear-screen

# 移除Control+T的绑定
$ bind -r "\C-t"

# 验证移除结果
$ bind -q clear-screen
# 如果没有绑定会显示相关信息

示例6:使用vi键映射

在vi模式下设置绑定:

# 首先设置bash为vi模式
$ set -o vi

# 在vi-insert模式下绑定
$ bind -m vi-insert '"\C-p": previous-history'
$ bind -m vi-insert '"\C-n": next-history'

# 在vi-command模式下绑定
$ bind -m vi-command '"k": previous-history'
$ bind -m vi-command '"j": next-history'

# 查看vi-insert模式的绑定
$ bind -m vi-insert -p | head -20

示例7:从文件加载绑定

保存和加载绑定配置:

# 保存当前绑定到文件
$ bind -p > ~/.bash_bindings

# 编辑文件添加自定义绑定
$ echo '" "\el": clear-screen"' >> ~/.bash_bindings
$ echo 'bind -x "\ep":"pwd"' >> ~/.bash_bindings

# 从文件加载绑定
$ bind -f ~/.bash_bindings

# 在bashrc中自动加载
$ echo 'bind -f ~/.bash_bindings' >> ~/.bashrc

示例8:显示Readline变量

查看和设置Readline变量:

# 显示所有Readline变量
$ bind -v

# 显示当前Readline变量值
$ bind -V

# 常用变量:
# editing-mode: emacs 或 vi
# bell-style: none, visible, audible
# completion-ignore-case: on 或 off
# show-all-if-ambiguous: on 或 off
# colored-stats: on 或 off

# 通过输入设置变量(在bashrc中)
$ echo 'set editing-mode vi' >> ~/.inputrc
$ echo 'set completion-ignore-case on' >> ~/.inputrc

示例9:实用绑定配置

一些提高效率的绑定配置:

# 添加到 ~/.bashrc 或 ~/.inputrc

# 1. 上下箭头搜索历史(前缀匹配)
"\e[A": history-search-backward
"\e[B": history-search-forward

# 2. PageUp/PageDown 浏览历史
"\e[5~": history-search-backward
"\e[6~": history-search-forward

# 3. Home/End 键
"\eOH": beginning-of-line
"\eOF": end-of-line
"\e[H": beginning-of-line
"\e[F": end-of-line

# 4. 删除整行
"\C-u": unix-line-discard

# 5. 快速跳转到行首/行尾
"\C-a": beginning-of-line
"\C-e": end-of-line

# 6. 删除到行首/行尾
"\C-w": backward-kill-word
"\C-k": kill-line

# 7. 单词间移动
"\e[1;9C": forward-word   # Cmd+右箭头 (Mac)
"\e[1;9D": backward-word  # Cmd+左箭头 (Mac)

# 8. 自定义命令绑定
bind -x '"\C-x\C-l":"ls -la"'
bind -x '"\C-x\C-d":"df -h"'
bind -x '"\C-x\C-m":"free -m"'

⚠️ 注意事项

  1. 会话限制:bind设置只在当前shell有效,重启后失效
  2. 配置文件:永久设置应添加到~/.bashrc~/.inputrc
  3. 冲突避免:避免覆盖重要的默认绑定
  4. 终端兼容:某些键序列可能在不同终端中表现不同
  5. 调试困难:错误的绑定可能导致奇怪的行为

💡 实用技巧

  1. 发现键序列:使用cat -vshowkey -a发现未知键序列
  2. 测试绑定:先测试再添加到配置文件
  3. 使用.inputrc:readline配置文件,bash和其他使用readline的程序都读取
  4. 条件绑定:在.inputrc中使用条件语句
  5. 恢复默认:删除~/.inputrc~/.bashrc中的绑定可恢复默认
# 在.inputrc中的条件绑定
$if Bash
    # 仅bash生效的设置
    "\C-x\C-r": re-read-init-file
$endif

# 使用cat -v发现键序列
# 按Ctrl+V,然后按目标键
$ cat -v
# 按Ctrl+右箭头显示:^[[1;5C

常见问题

Q: bind设置为什么重启终端后就失效了?

A: bind设置只对当前shell会话有效。要永久生效,需要将绑定命令添加到~/.bashrc~/.inputrc文件中。

Q: .inputrc和.bashrc中的绑定有什么区别?

A: .inputrc是readline库的配置文件,所有使用readline的程序(如bash、python、mysql等)都会读取。.bashrc中的绑定只影响bash。

Q: 如何查看某个按键的当前绑定?

A: 使用bind -p | grep "键序列",或使用bind -S查看宏绑定。

Q: 绑定到shell命令和绑定到readline函数有什么区别?

A: 绑定到readline函数(如clear-screen)在命令行编辑时立即执行。绑定到shell命令(用-x)会作为普通shell命令执行,可能会影响当前输入。

Q: 为什么我的Alt键绑定不工作?

A: 可能是终端程序拦截了Alt键。尝试使用\e(Escape)前缀,或检查终端设置中是否启用了Alt键。

相关命令

  • set - 设置shell选项(set -o vi设置vi模式)
  • stty - 设置终端选项
  • readline - GNU命令行编辑库
  • alias - 创建命令别名
  • history - 命令历史管理
  • shopt - 设置shell行为选项