VERSÃO CURTA (TL;DR)
Eu tenho 2 pequenos arquivos de uma linha, aparentemente idênticos:
$ cat f1 f2
./cconv.sh 100 EUR USD
./cconv.sh 100 EUR USD
Mas eles não são, há uma diferença de 1 byte no tamanho:
$ ls -l f1 f2
(...) 24 oct. 30 16:19 f1
(...) 23 oct. 30 16:19 f2
$ diff f1 f2
1c1
< ./cconv.sh 100 EUR USD
---
> ./cconv.sh 100 EUR USD
Eu costumava dhex
descobrir a diferença hexadecimal. Parece que :
f1
termina comc2 a0 55 53 44 0a
f2
termina com20 55 53 44 0a
Alguém tem ideia do que está acontecendo aqui? Qual é a diferença e, mais importante, de onde poderia vir? Aqui está um link para um arquivo zip contendo os 2 arquivos e uma captura de tela do dhex
resultado.
VERSÃO LONGA (EXPLICAÇÕES ADICIONAIS)
Os 2 arquivos são trechos do meu arquivo ~/.bash_history file
.
Percebi um comportamento muito estranho das minhas conchas. Pegue o seguinte script muito básico:
#!/bin/sh
echo $#
echo "$1"
echo "$2"
echo "$3"
exit 0
Sob certas circunstâncias (mas quais ???), ele não usa o espaço como separador de argumentos:
$ ./cconv.sh 100 EUR USD
2
100
EUR USD
Mas às vezes funciona exatamente como deveria:
$ ./cconv.sh 100 EUR USD
3
100
EUR
USD
Isso me deixa louco! Passei várias horas tentando descobrir o que estava acontecendo. Aqui estão alguns testes que fiz para tentar reduzi-lo:
- Eu trabalho em um laptop com Debian 11, Gnome 3.38. Mas acontece que também tenho uma máquina virtual com exatamente o mesmo sistema operacional (D11, G3.38), e na VM tudo funciona bem. Então, obviamente, devo ter feito algo no meu laptop bare metal para que ele se comportasse mal. Mas o que ???
- Percebi que o problema ocorre apenas em uma sessão gráfica. Se eu abrir um tty (Ctrl+Alt+F n ), funciona bem
- Suspeitei do meu emulador de terminal. Mas o comportamento é o mesmo em emuladores diferentes (tentei Gnome Terminal, Terminator e Konsole, mesmo resultado)
- Suspeitei da concha. Mas o comportamento é o mesmo com Bash ou Dash
- Desativei todas as personalizações que pude pensar:
- Eu removi temporariamente
/etc/bashrc
,/etc/profile
e/etc/inputrc
/etc/rc.local
- Eu removi temporariamente
~/.bashrc
e~/.profile
~/.inputrc
- Desativei todas as extensões do Gnome Shell
- Eu removi temporariamente
- Eu até suspeitei do teclado e conectei um teclado USB. Mesmo resultado.
Estou realmente confuso, e não tenho a menor idéia do que está acontecendo. Eu finalmente notei essa pequena diferença entre os 2 comandos em ~/.bash_history
: um vem da minha sessão do Gnome, o outro vem da minha sessão tty. Obviamente, há uma diferença, mas o que é exatamente e qual poderia ser a causa?
c2 a0
é a codificação UTF-8 do caractere de espaço ininterrupto . Geralmente parece um espaço regular, mas não é reconhecido como espaço em branco pelo shell.Em alguns mapas de teclas, algo como AltGr+ Spaceou Option+ Spaceproduz um espaço sem quebra. O que é divertido se o seu mapa de teclado também tiver, por exemplo, o caractere pipe atrás de AltGrou Option, facilitando a digitação
|<nbsp>
em vez de|<sp>
, dando a você erros como este:(Acho que SE dobra o nbsp para um espaço regular, então você provavelmente não receberá o erro se copiar isso daqui.)
Se você copiou e colou os argumentos de alguma outra ferramenta, pode obter uma formatação estranha a partir daí, mas depende do programa.
Consulte Lidar com o caractere nbsp no shell para algumas soluções para não produzir o caractere.