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.
quelle
history 2|xxd
(weil derhistory
Befehl selbst ist immer der letzte in der Liste) oder Typhistory|grep "CommandWithProblem"|xxd
. Sie können anstelle von ein beliebiges anderes Hex-Anzeigeprogramm verwendenxxd
, 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.Antworten:
Eine Möglichkeit besteht darin, sich die Zeichen anzusehen, die Sie mit einem Hex-Viewer oder Editor verwenden möchten.
hexdump
ist eine gute Option, wenn Sie auf das Terminal beschränkt sind.Sie können hier sehen, dass die
space
,close-square-brace
,space
sind richtig -0x20
,0x5D
,0x20
.Diese Werte sind ASCII-Codes, angezeigt in hexadezimal . Beliebiger Wert außerhalb des Bereichs
0x20
-0x7E
ist kein " druckbares Zeichen " Was ASCII anbelangt, wird es mit Befehlszeilenschnittstellen höchstwahrscheinlich nicht funktionieren.Hinweis: Ich habe dein erstes kopiert " gebrochen "Linie zur Verwendung in der
hexdump
Beispiel oben, so hat etwas das ersetzt Nicht-ein-ASCII-Raum mit einem ASCII-Leerzeichen zwischen Ihrer ursprünglichen Quelle und Ihrer gerenderten Frage.Führen Sie die folgenden Schritte aus, um dies zu wiederholen:
hexdump -Cv <<"EOF"
und drücke EingebenEOF
in einer eigenen Zeile und drücken Sie EingebenTerminals und Befehlszeilenschnittstellen können Sonderzeichen nicht gut verarbeiten, wie Sie festgestellt haben. Wenn Sie beim Formatieren von Dokumenten nicht sehr vorsichtig sind, treten auch Probleme mit Microsoft Word (und anderen) auf, wenn Sie " intelligente Anführungszeichen ", Gedankenstriche, die Liste geht weiter ...
Finde den Unterschied: (die Spitze ist " intelligente Anführungszeichen ", der Boden ist" gerade Anführungszeichen ")
Hier sind die offenen Anführungszeichen keine einfachen ASCII-Anführungszeichen (
"
), sind aber ein Unicode / UTF-8 Serie -0xE2
,0x80
,0x9C
, oderU+201C
- was das Terminal nicht erwartungsgemäß handhabt.Kiwys Vorschlag von
cat -A
erledigt auch die Arbeit:Hinweis: beim Benutzen
echo "..." | hd
Sie haben die Chance, dass die Bash Teile der Zeichenfolge ersetzt, die Sie untersuchen möchten. Dies ist besonders wichtig, wenn Sie versuchen, Komponenten eines Skripts zu überprüfen.Versuchen Sie zum Beispiel:
Diese Methoden ersetzen Komponenten durch den entsprechenden Text. Verwenden Sie eine der folgenden Methoden, um dies zu vermeiden. Beachten Sie die Verwendung von einfachen Anführungszeichen (
'
), und ein " zitiert Heredoc " ("EOF"
).quelle
echo "[ -f /etc/openvpn.ovpn ]" | hd
kehrt zurück[...] c2 a0 [...]
. Wir können das sehen c2 a0 UT-8-Zeichen nicht brechender RaumDu könntest benutzen
cat
mit dem-A
Option: aus dem Handbuch:So
cat -A yourscrip.sh
zeigt dir unsichtbare und seltsame Charaktere.quelle
echo "[ -f /etc/openvpn.ovpn ]" | cat -A
kehrt zurück[ -f /etc/openvpn/client.ovpnM-BM- ]$
. Wir können das sehen M-BM- UT-8-Zeichen nicht brechender Raumecho "<your command>" | hd
sollte arbeiten. Suchen Sie nach einem Backspace (0x08) oder Zeichen mit den Codes & gt; = 80.echo "<your command>" | wc -b
Es ist auch eine gute Idee, zu überprüfen, ob die Anzahl mit den angezeigten Werten übereinstimmt.Das Kopieren von Inhalten aus Dateien, die mit "Office" im Namen erstellt wurden, ist gefährlich, da solche Software häufig das Ersetzen von Zeichen erlaubt: Achten Sie auf doppelte Anführungszeichen in Französisch, die durch "Guillemets" ersetzt werden, und auf einfache Anführungszeichen in Englisch Äquivalente öffnen / schließen. Das härteste, das ich jemals gefunden habe, war ein nicht unterbrechendes Leerzeichen mit einer Breite von 0 in der Mitte eines Dateinamens (3 Tage Ausfallzeit des Servers ...).
quelle
hd
ist die Abkürzung fürhexdump
was auch in Atties Antwort erwähnt wird.hd
ist äquivalent zuhexdump -C
.echo "[ -f /etc/openvpn.ovpn ]" | hd
kehrt zurück[...] c2 a0 [...]
. Wir können das sehen c2 a0 UT-8-Zeichen nicht brechender RaumBash und andere Shells wie zsh können die aktuelle Befehlszeile in einem Editor öffnen. Die Standardverknüpfung für Bash ist
C-x C-e
( Strg X Strg E ), und es öffnet sich in der ersten verfügbaren von$VISUAL
,$EDITOR
und Emacs. In der Praxis ist dies für das Debuggen und Ändern komplexer Befehle von unschätzbarem Wert. Je nachdem, wie Sie es sehen, ist zsh hier freundlicher als bash: Wenn der Editor beendet wird, führt bash den Befehl sofort aus, während zsh darauf wartet, dass Sie drücken Eingeben (Damit haben Sie mehr Möglichkeiten, den Befehl zu bearbeiten.)Nach dem Öffnen des Befehls in einem Editor können Sie die Editoren so konfigurieren, dass Nicht-ASCII-Zeichen anders angezeigt werden.
Zum Beispiel, mit Vim Mit diesen Einstellungen:
Oder passen Sie die Methoden der anderen Antworten an:
quelle