Depurar strings com caracteres invisíveis
Recentemente, precisei criar um script bash que iterava sobre o barramento USB, listando os dispositivos conectados e comparando seus nomes com uma lista de dispositivos específicos que eu queria configurar.
Primeiro identifiquei o nome dos dispositivos com um loop:
| |
A ideia parecia simples, verificar se o nome do dispositivo, por exemplo USB OPTICAL MOUSE, correspondia a um item da minha lista e, se sim, executar um comando.
No entanto, ao rodar o script, percebi que a comparação nunca entrava no bloco
condicional, mesmo quando o texto parecia ser igual. Usei o comando echo
para imprimir o valor das variáveis, mas tudo parecia correto, até que me dei
conta que o problema estava nos caracteres “invisíveis”.
Arquivos no /sys geralmente contêm uma quebra de linha \n no final, e em
alguns casos, podem incluir espaços em branco adicionais. Esses caracteres não
são visíveis com o echo, mas afetam as comparações de strings.
Identificando caracteres “invisíveis”
Para depurar esse tipo de problema, é importante inspecionar o conteúdo real da string, incluindo caracteres de controle. Aqui estão alguns métodos úteis:
- Usando o comando
hexdump
| |
O hexdump exibe os bytes em formato hexadecimal na coluna do meio e sua
representação em string (ASCII) na coluna da direita. No exemplo, o 20 representa
um espaço (caractere imprimível) e o 0a representa a quebra de linha (\n, um
caractere de controle e não imprimível). Repare que há um espaço (20) antes do
0a, o que, embora seja um caractere imprimível, no final da linha o torna
“invisível”, e foi a causa do problema.
- Usando o comando
cat
| |
Nesse caso, a opção -A exibe os caracteres não imprimíveis. O simbolo $
indica a quebra de linha (\n)
- Usando o comando
od
| |
Com od -c, você pode ver claramente os espaços e a quebra de linha na representação
do caractere.
Corrigindo o problema
Em Python, um simples str.strip() resolve o problema, removendo espaços e quebras
de linha do início e do final da string. No entanto, no Bash, e as alternativas
são muitas. Para esse caso, o comando xargs foi suficiente.
| |
Conclusão
Ao trabalhar com strings de arquivos de sistema, especialmente nos diretórios
/sys e /proc, é fundamental ter em mente que caracteres invisíveis podem
comprometer suas comparações.
Ferramentas como hexdump, od e cat -A são essenciais para a depuração,
pois permitem visualizar o conteúdo real do arquivo e entender por que seu
código não está se comportando como esperado.