Eu instruí meu emulador de terminal a enviar "\u{85}" (caractere de controle C1 "NEXT LINE" (NEL)
) pelo pipe para ser capturado pelo bash:
bind -x '"\u0085":"echo Hello"'
Mas isso não aciona nada. Então minha primeira pergunta é: Como eu represento pontos de código unicode para bind -x
? Estranhamente, o bash pega a representação octal:
bind -x '"\205":"echo Hello"'
Em qualquer caso, o acima cria artefatos estranhos no shell:
Hello
$ �Hello
Hello
$ �
Imaginei que o caractere de controle provavelmente tem alguns efeitos colaterais. Então, minha segunda pergunta é: qual intervalo unicode posso reutilizar com segurança para meu próprio bem?
readline
se importa com a codificação de caracteres, pois, por exemplo, um toque de Backspaceexcluiria os bytes 0xc3 e 0xa9 em uma localidade UTF-8 (onde essa é a codificação deé
), mas apenas 0xa9 em uma localidade ISO8859-1 onde 0xc3 0xa9 é a codificação de dois caracteresÃ
e©
, mas por sua associação de teclas, não o faz.As ligações vinculam matrizes de bytes.
A sintaxe que pode ser usada para especificar esses bytes é descrita em
info -n 'Readline Init File Syntax' readline
(o bashbind
apenas fornece ao readline instruções de arquivo init readline).Então as opções para especificar esses bytes são:
\ooo
com seu valor octal\xhh
com seu valor hexadecimal\C-X
em , .. , , , , , ,X
@
A
Z
[
\
]
^
_
?
\M-\C-X
com os mesmos caracteres acima.\M-X
com X variando de espaço a~
, os caracteres ASCII imprimíveis.O caractere U+0085 é codificado como 0x85 em conjuntos de caracteres iso8859-x, como 0xc2 0x85 em UTF-8, como 0x81 0x30 0x81 0x35 em GB18030. Se você quiser vincular isso, precisará saber em qual charmap seu terminal envia esses caracteres.
Seus artefatos estranhos sugerem que ele é codificado em UTF-8, pois ele executa o
echo hello
comando no segundo byte da codificação UTF-8 de U+0085, enviando o primeiro byte como está para exibição, que seu terminal renderiza como o�
caractere de substituição, pois essa é uma codificação inválida.Então, você precisará de um dos seguintes:
Ou envie os bytes literalmente, inserindo esse caractere (de controle) literalmente dentro do primeiro par de
"..."
ou usando as$'...'
aspas no estilo Korn, dentro das quais você também pode usar\ooo
ou\xhh
ou no bash 4.2 ou mais recente, as notações\uhhhh
ou\Uhhhhhhhh
do zsh:No bash, isso
\u0085
é codificado no charmap da configuração de localidade no momento em que o código foi lido (não executado como no zsh). Se você não alterar a localidade no meio do caminho,~/.bashrc
isso não fará diferença.