Ich versuche, die Ausgabe eines Befehls in einer Datei zu speichern. Der Befehl lautet:
clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt
Die resultierende output.txt-Datei beim Öffnen (von gedit und jedit auf Ubuntu) gibt mir jedoch Folgendes:
[0;1;32mTranslationUnitDecl[0m[0;33m 0x4192020[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x4192558[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __int128_t[0m [0;32m'__int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192270[0m [0;32m'__int128'[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x41925b8[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __uint128_t[0m [0;32m'unsigned __int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192290[0m [0;32m'unsigned __int128'[0m
...
Wann sollte es wirklich so aussehen:
TranslationUnitDecl 0x4e46020 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x4e46558 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x4e46270 '__int128'
|-TypedefDecl 0x4e465b8 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x4e46290 'unsigned __int128'
...
Ich dachte, es könnte ein Codierungsproblem sein. Ich habe die Codierung der Datei überprüft, file -bi output.txt
die ausgegeben wird text/plain; charset=us-ascii
.
Ich dachte, wenn ich die Codierung auf utf-8 ändere, ist das Problem möglicherweise behoben. Deshalb habe ich Folgendes versucht:
clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt
aber es machte keinen Unterschied.
Was kann ich tun, um dieses Problem zu lösen?
Das Problem ist nicht, dass ich versuche, die Version mit der hervorgehobenen Syntax anzuzeigen (ich hatte überhaupt keine Probleme, sie anzuzeigen). Ich muss den durch Klirren erzeugten AST in einer Datei speichern und dann analysieren, was mit den verbleibenden Farbinformationen schwierig wäre.
>
keine Ausgabe generiert wird, sondern lediglich die Shell bezeichnet, die die Ausgabe Ihresclang
Befehls in die angegebene Datei und nicht in das Terminal schreiben soll. Danach betrachten Sie es auf eine Weise, die Farbcodes nicht auf die gleiche Weise zulässt. Wenn Sie incat
der Datei wären, würde es funktionieren, als würde das Terminal übernehmen, und Sie könnenless
das gleiche mit der-R
Flagge machen.column
Befehl, der durch ANSI-Farb- Escape-Zeichen verwechselt wird , Verhindern von ANSI-Escape-Sequenzen in der Terminal-Ausgabe und Warum wirdcat /dev/urandom
Ihr Terminal beschädigt?Antworten:
Es hat nichts mit Codepages / Codierung zu tun. Ihre Ausgabe ist kein reiner Text. Es enthält die Sequenzen wie
[0;1;32m
. Diese Zeichenfolgen (es gibt auch ein nicht gezeigtes [Escape] -Zeichen vor jedem dieser Zeichen) sind Anweisungen an das Terminal, um Text fett, kursiv, in verschiedenen Farben usw. anzuzeigen. Dies führt zu einer einfacheren Ausgabe, wenn Ihr Terminal unterstützt es.Es sollte eine Option geben, mit der clang angewiesen wird, nicht zu versuchen, die Ausgabe zu verschönern, sondern stattdessen einfachen Text zu verwenden. Überprüfen Sie das Handbuch. (Ich habe keine zur Hand, daher kann ich Ihnen nicht sagen, was der richtige Befehl wäre.)
quelle
clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt
die mir die richtige Ausgabe gab.isatty(stdout)
), ist die EinstellungTERM
auf (zdumb
. B.) .Anstatt die Farben aus der Ausgabe zu entfernen, können Sie alternativ die farbige Ausgabe in Ihrem Terminal anzeigen, indem Sie die Option raw von verwenden
less
quelle
Diese Zeichen
[0;33m
sehen für mich wie eine Terminal-Ausgabesteuerung aus. Sie sind Teil einer Reihe von Escape-Sequenzen, die häufig zum Anwenden von Farben auf Text im Terminal verwendet werden. In diesem Rohzustand wird es auch häufig zum Auftragen von Farbe auf die Bash-Eingabeaufforderung selbst.bashrc
verwendet.(Die meisten finden es hässlich, aber ich mag es).
Prüfen Sie, ob Sie in der Lage sind, einen Schalter zum Entfernen von Farbcodierungen oder Ähnlichem aus der Ausgabe Ihrer Befehle zu finden, und prüfen Sie, ob dies hilfreich ist.
quelle
xterm
verwandte Sache. Sehen Sie sich diese hervorragende Antwort des leitenden Entwicklers von anxterm
.