Ich hatte dieses seltsame Verhalten heute Morgen in einem Bash-Terminal:
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
- Der erste Befehl war geklebt aus einem mit gedit bearbeiteten Skript.
- Der zweite war direkt eingegeben im terminal.
Nach einigem Graben finde ich das heraus Entfernen des 30. Zeichens (Das Leerzeichen zwischen client.conf und "]") und das Ersetzen durch ein Leerzeichen haben dazu geführt, dass der Befehl wieder funktioniert.
Meine Annahme war richtig: Ein unbekanntes Leerzeichen ist in den Befehl eingedrungen , aber die Frage ist:
- Wie kann ich diese Zeichen im Terminal anzeigen, damit ich den Befehl debuggen kann? Und noch wichtiger:
- Wie kann ich das verhindern?
Übrigens, ich verwende Ubuntu 18.04 / Französisch. Das Skript, von dem ich den Befehl einfüge, befindet sich auf einem USB-Laufwerk und wurde möglicherweise auch unter Windows bearbeitet.
Vielen Dank für Ihre sehr guten Antworten. Der schlechte Charakter ist a c2 a0 Nicht unterbrechendes Leerzeichen UTF-8-Zeichen. Die Frage Wie entferne ich einen speziellen 'M-BM-' Charakter mit sed hat interessante Fakten über diesen Charakter.
Das Seltsame ist, dass das Skript frei von diesem Charakter ist. Ich weiß also nicht, woher es kam.
history 2|xxd
(weil der history
Befehl selbst ist immer der letzte in der Liste) oder Typ history|grep "CommandWithProblem"|xxd
. Sie können anstelle von ein beliebiges anderes Hex-Anzeigeprogramm verwenden xxd
, aber das ist ein Standardformat, das ich mag.
set -x
. Dies zeigt Ihnen den Befehl & amp; wie es aufgeteilt ist. Es würde nicht unbedingt "schlechter Charakter hier" heißen, aber es würde Ihnen zeigen, dass sich Bash nicht auf diesen Charakter aufteilt.