Saya mencoba untuk menyimpan output dari perintah ke file. Perintahnya adalah:
clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt
Namun file output.txt yang dihasilkan ketika dibuka (oleh gedit dan jedit di ubuntu) memberi saya ini:
[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
...
Kapan seharusnya terlihat seperti ini:
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'
...
Saya pikir itu mungkin masalah penyandian, saya memeriksa penyandian file, file -bi output.txt
yang menghasilkan text/plain; charset=us-ascii
.
Saya pikir mungkin jika saya mengubah encoding ke utf-8 masalah akan diperbaiki jadi saya mencoba ini:
clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt
tapi itu tidak membuat perbedaan.
Apa yang bisa saya lakukan untuk mengatasi masalah ini?
Masalahnya bukan bahwa saya mencoba untuk melihat versi yang disorot sintaks (saya tidak punya masalah melihatnya di tempat pertama). Saya perlu menyimpan AST yang dihasilkan oleh dentang ke file dan kemudian menguraikannya, yang akan sulit dengan informasi warna yang tersisa.
>
tidak menghasilkan output, itu hanya menunjuk ke shell bahwa Anda ingin meletakkan output dariclang
perintah Anda di file yang diberikan, daripada terminal itu. Setelah itu Anda melihatnya dengan cara yang tidak mengizinkan kode warna dengan cara yang sama. Jika Anda kecat
file itu akan berfungsi sebagai terminal akan mengambil alih, dan Anda dapat melakukanless
hal yang sama dengan-R
bendera.column
perintah bingung oleh pelolosan warna ANSI , Mencegah urutan pelarian ANSI dalam output terminal , dan Mengapacat /dev/urandom
memecah terminal Anda?Jawaban:
Itu tidak ada hubungannya dengan codepages / encoding. Output Anda bukan teks biasa. Ini berisi urutan seperti
[0;1;32m
. String ini (ada, tidak ditampilkan, karakter [melarikan diri] juga sebelum masing-masing) adalah instruksi ke terminal untuk menampilkan teks tebal, miring, dalam berbagai warna, dll. Ini menghasilkan keluaran yang lebih mudah dibaca, jika terminal Anda mendukungnya.Seharusnya ada opsi untuk memberi tahu dentang untuk tidak mencoba mempercantik hasil, tetapi gunakan teks biasa. Periksa manualnya. (Saya tidak punya satu berguna, jadi saya tidak bisa memberi tahu Anda apa perintah yang tepat.)
sumber
clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt
yang memberi saya hasil yang benar.isatty(stdout)
) adalah untuk diaturTERM
ke (misalnya)dumb
.Sebagai alternatif, alih-alih menghapus warna dari output, Anda dapat melihat output berwarna di terminal Anda dengan menggunakan opsi mentah
less
sumber
Karakter-karakter itu, seperti
[0;33m
terlihat seperti kontrol keluaran terminal bagi saya. Mereka adalah bagian dari serangkaian urutan pelarian yang sering digunakan untuk menerapkan warna ke teks di terminal. Dalam keadaan mentah seperti ini, ia juga sering digunakan untuk mengaplikasikan warna ke bash prompt itu sendiri - Inilah yang telah saya gunakan.bashrc
selama bertahun-tahun di semua mesin saya:(Kebanyakan berpikir itu jelek, tapi saya suka).
Lihat apakah Anda dapat menemukan saklar untuk menghapus kode warna atau sejenisnya dari output perintah Anda dan lihat apakah itu membantu.
sumber
xterm
hal yang terkait. Lihat jawaban luar biasa ini oleh pengembang utamaxterm
.