Ho avuto questo strano comportamento questa mattina in 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
- Il primo comando è stato incollato da uno script modificato con gedit.
- Il secondo è stato digitato direttamente nel terminale.
Dopo qualche ricerca, scopro che la rimozione del 30 ° carattere (lo spazio tra client.conf e "]") e la sua sostituzione con uno spazio ha fatto funzionare nuovamente il comando.
La mia ipotesi era corretta: un personaggio sconosciuto sconosciuto è entrato nel comando , ma la domanda è:
- Come posso rivelare quei caratteri nel terminale in modo da poter eseguire il debug del comando? E più importante:
- Come posso evitare che ciò accada di nuovo?
A proposito, ho Ubuntu 18.04 / lingua francese, lo script da cui ho incollato il comando è in un'unità USB e potrebbe essere stato modificato anche su Windows.
Grazie per le tue ottime risposte. Il personaggio cattivo è un c2 a0 UTF-8 di spazio non-break . La domanda su come rimuovere il personaggio speciale 'M-BM-' con sed ha fatti interessanti su quel personaggio.
La cosa strana è che la sceneggiatura è libera da questo personaggio. Quindi non so da dove provenga.
history 2|xxd
(poiché il history
comando stesso è sempre l'ultimo nell'elenco), oppure digitare history|grep "CommandWithProblem"|xxd
. È possibile utilizzare qualsiasi altro programma di visualizzazione esadecimale invece di xxd
, ma l'impostazione predefinita è un formato che mi piace.
set -x
. Questo ti mostrerebbe il comando e come è diviso. Non direbbe necessariamente "cattivo personaggio qui", ma ti mostrerebbe che bash non si stava dividendo su quel personaggio.