J'ai eu ce comportement étrange ce matin dans un terminal 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
- La première commande a été collée à partir d'un script édité avec gedit.
- Le second a été tapé directement dans le terminal.
Après quelques recherches, je découvre qu'en supprimant le 30ème caractère (l'espace entre client.conf et "]") et en le remplaçant par un espace, la commande a de nouveau fonctionné.
Mon hypothèse était juste: un caractère vierge inconnu s'est glissé dans la commande , mais la question est:
- Comment puis-je révéler ces caractères dans le terminal afin de pouvoir déboguer la commande? Et plus important encore:
- Comment puis-je empêcher que cela se reproduise?
BTW, j'exécute Ubuntu 18.04 / langue française, le script à partir duquel je colle la commande est dans un lecteur USB et peut avoir été modifié sur Windows aussi.
Merci pour vos très bonnes réponses. Le mauvais caractère est un caractère UTF-8 d'espace insécable c2 a0 . La question Comment supprimer le caractère spécial 'M-BM-' avec sed a un fait intéressant à propos de ce caractère.
Ce qui est étrange, c'est que le script est exempt de ce personnage. Donc je ne sais pas d'où ça vient.
history 2|xxd
(car la history
commande elle-même est toujours la dernière de la liste), ou tapez history|grep "CommandWithProblem"|xxd
. Vous pouvez utiliser n'importe quel autre programme d'affichage hexadécimal au lieu de xxd
, mais cela correspond par défaut à un format que j'aime.
set -x
. Cela vous montrerait la commande et comment elle est divisée. Cela ne signifierait pas nécessairement «mauvais personnage ici», mais cela vous montrerait que bash ne se divisait pas sur ce personnage.