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
bind是bash的内置命令,不是独立程序| 表示法 | 说明 |
|---|---|
| \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命令的键序列 |
查看当前所有的键盘绑定:
# 显示当前所有绑定(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 # ... 更多绑定
查询特定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".
绑定键序列到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+左箭头
使用-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"'
移除已有的键绑定:
# 移除Alt+L的绑定
$ bind -r "\el"
# 移除所有clear-screen函数的绑定
$ bind -u clear-screen
# 移除Control+T的绑定
$ bind -r "\C-t"
# 验证移除结果
$ bind -q clear-screen
# 如果没有绑定会显示相关信息
在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
保存和加载绑定配置:
# 保存当前绑定到文件
$ 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
查看和设置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
一些提高效率的绑定配置:
# 添加到 ~/.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"'
~/.bashrc或~/.inputrccat -v或showkey -a发现未知键序列.inputrc中使用条件语句~/.inputrc和~/.bashrc中的绑定可恢复默认# 在.inputrc中的条件绑定
$if Bash
# 仅bash生效的设置
"\C-x\C-r": re-read-init-file
$endif
# 使用cat -v发现键序列
# 按Ctrl+V,然后按目标键
$ cat -v
# 按Ctrl+右箭头显示:^[[1;5C
A: bind设置只对当前shell会话有效。要永久生效,需要将绑定命令添加到~/.bashrc或~/.inputrc文件中。
A: .inputrc是readline库的配置文件,所有使用readline的程序(如bash、python、mysql等)都会读取。.bashrc中的绑定只影响bash。
A: 使用bind -p | grep "键序列",或使用bind -S查看宏绑定。
A: 绑定到readline函数(如clear-screen)在命令行编辑时立即执行。绑定到shell命令(用-x)会作为普通shell命令执行,可能会影响当前输入。
A: 可能是终端程序拦截了Alt键。尝试使用\e(Escape)前缀,或检查终端设置中是否启用了Alt键。
set - 设置shell选项(set -o vi设置vi模式)stty - 设置终端选项readline - GNU命令行编辑库alias - 创建命令别名history - 命令历史管理shopt - 设置shell行为选项