Eu tive esse comportamento estranho nesta manhã em um terminal do bash:
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
bash: [: missing «]»
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
true
- O primeiro comando foi colado a partir de um script editado com o gedit.
- O segundo foi digitado diretamente no terminal.
Após algumas pesquisas, descobri que remover o 30º caractere (o espaço entre client.conf e "]") e substituí-lo por um espaço fazia com que o comando funcionasse novamente.
Minha suposição estava certa: um caractere em branco desconhecido entrou no comando , mas a pergunta é:
- Como posso revelar esses caracteres no terminal para poder depurar o comando? E mais importante:
- Como impedir que isso aconteça novamente?
BTW, eu executando o Ubuntu 18.04 / idioma francês, o script do qual colo o comando está em uma unidade USB e também pode ter sido editado no Windows.
Obrigado por suas respostas muito boas. O caractere inválido é um caractere UTF-8 de espaço c2 a0 . A questão Como remover o caractere especial 'M-BM-' com o sed tem um fato interessante sobre esse caractere.
O estranho é que o script está livre desse personagem. Então eu não sei de onde veio.
history 2|xxd
(porque o history
próprio comando é sempre o último da lista) ou digite history|grep "CommandWithProblem"|xxd
. Você pode usar qualquer outro programa de exibição hexadecimal em vez de xxd
, mas o padrão é o formato que eu gosto.
set -x
. Isso mostraria o comando e como ele é dividido. Não seria necessariamente dizer "personagem ruim aqui", mas mostraria que o bash não estava se dividindo nesse personagem.