我指示我的终端仿真器将“\u{85}”(C1 控制字符"NEXT LINE" (NEL)
)发送到管道中以便被 bash 捕获:
bind -x '"\u0085":"echo Hello"'
但这不会触发任何事情。所以我的第一个问题是:如何表示unicode代码点bind -x
?奇怪的是,bash选择了八进制表示:
bind -x '"\205":"echo Hello"'
无论如何,上述操作都会在 shell 中产生奇怪的现象:
Hello
$ �Hello
Hello
$ �
我认为控制字符可能有一些副作用。所以我的第二个问题是,我可以安全地重新利用哪个 Unicode 范围来为自己谋利?
readline
确实关心字符编码,例如,Backspace在 UTF-8 区域设置中, 的一个笔划会同时删除 0xc3 和 0xa9 字节(这是 的编码),但在 ISO8859-1 区域设置中, 只会删除 0xa9,其中 0xc3 0xa9 是两个字符和é
的编码,但对于其键绑定,它不会这样做。Ã
©
绑定绑定字节数组。
info -n 'Readline Init File Syntax' readline
可以使用什么语法来指定这些字节在(bashbind
只为 readline 提供 readline init 文件指令)中描述。因此指定这些字节的选项是:
\ooo
它们的八进制值一样\xhh
和它们的十六进制值一样\C-X
如, .. , , , , ,X
@
A
Z
[
\
]
^
_
?
\M-\C-X
与上面相同的字符。\M-X
X 的范围从空格到~
,即 ASCII 可打印字符。U+0085 字符在 iso8859-x 字符集中编码为 0x85,在 UTF-8 中编码为 0xc2 0x85,在 GB18030 中编码为 0x81 0x30 0x81 0x35。如果您想要绑定它,您需要知道您的终端在哪个字符表中发送这些字符。
您的奇怪的文物表明它是 UTF-8 编码的,因为它
echo hello
在 U+0085 的 UTF-8 编码的第二个字节上运行命令,将第一个字节按原样发送以供显示,您的终端将其呈现为�
替换字符,因为这是无效的编码。然后,你需要以下之一:
或者逐字发送字节,方法是逐字输入该(控制)字符到第一对
"..."
或内,使用 Korn 样式的$'...'
引号,在引号内您还可以使用\ooo
或\xhh
或在 bash 4.2 或更新版本中\uhhhh
使用或\Uhhhhhhhh
来自 zsh 的符号:在 bash 中,这是在读取
\u0085
代码时在区域设置字符映射中编码的(而不是像在 zsh 中那样运行)。如果您中途不更改区域设置,则不会产生任何影响。~/.bashrc