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.