Próbuję zapisać dane wyjściowe polecenia w pliku. Polecenie to:
clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt
Jednak wynikowy plik output.txt po otwarciu (przez gedit i jedit na ubuntu) daje mi to:
[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
...
Kiedy naprawdę powinno to wyglądać tak:
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'
...
Myślałem, że może to być problem z kodowaniem, sprawdziłem kodowanie pliku, file -bi output.txt
który wyprowadza text/plain; charset=us-ascii
.
Pomyślałem, że jeśli zmienię kodowanie na utf-8, problem zostanie rozwiązany, więc spróbowałem:
clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt
ale to nie miało znaczenia.
Co mogę zrobić, aby rozwiązać ten problem?
Problemem nie jest to, że próbuję wyświetlić wersję z podświetloną składnią (nie miałem problemu z jej obejrzeniem). Muszę zapisać plik AST wygenerowany przez clang do pliku, a następnie parsować go, co byłoby trudne przy pozostawionych informacjach o kolorze.
>
nie generuje danych wyjściowych, po prostu oznacza w powłoce, że chcesz umieścić dane wyjścioweclang
polecenia w danym pliku, a nie w terminalu. Następnie oglądasz go w sposób, który nie dopuszcza kodów kolorów w ten sam sposób. Jeśli przejdziesz docat
pliku, działałoby to tak, jakby przejął go terminal i możeszless
zrobić to samo z-R
flagą.column
polecenia pomylone przez zmiany koloru ANSI , Zapobiegaj sekwencjom ucieczki ANSI w danych wyjściowych terminala i Dlaczegocat /dev/urandom
psuje terminal?Odpowiedzi:
Nie ma to nic wspólnego ze stronami kodowymi / kodowaniem. Twój wynik nie jest zwykłym tekstem. Zawiera takie sekwencje jak
[0;1;32m
. Te ciągi (przed każdym z nich znajduje się również nie pokazany znak [ucieczki]) są instrukcjami dla terminala, aby wyświetlać pogrubiony tekst, kursywę, w różnych kolorach itp. W rezultacie terminal jest łatwiejszy do odczytania, jeśli twój terminal obsługuje to.Powinna istnieć opcja informowania clang, aby nie próbował upiększać wyników, ale zamiast tego użyj zwykłego tekstu. Sprawdź instrukcję. (Nie mam jednej poręczności, więc nie mogę powiedzieć, jakie byłoby właściwe polecenie).
źródło
clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt
co dało mi prawidłowy wynik.isatty(stdout)
), należy ustawićTERM
na (npdumb
. ) .Alternatywnie, zamiast usuwania kolorów z danych wyjściowych, możesz wyświetlić kolorowe dane wyjściowe w terminalu, używając opcji raw
less
źródło
Te znaki, takie jak
[0;33m
dla mnie, wyglądają jak sterowanie wyjściami terminala. Są częścią zestawu sekwencji specjalnych, które są często używane do nakładania kolorów na tekst w terminalu. W stanie surowym, takim jak ten, jest również często używany do nakładania koloru na sam monit bash - oto, czego używałem.bashrc
od lat na wszystkich moich maszynach:(Większość uważa, że to brzydkie, ale mi się podoba).
Sprawdź, czy jesteś w stanie znaleźć przełącznik, aby usunąć kodowanie kolorami itp. Z wyników poleceń i sprawdź, czy to pomoże.
źródło
xterm
. Zobacz tę doskonałą odpowiedź wiodącego autoraxterm
.