Clang, yeniden yönlendirildiğinde neden anlaşılmaz bir metin oluşturuyor?


20

Bir komutun çıktısını bir dosyaya kaydetmeye çalışıyorum. Komut:

clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt

Ancak açıldığında elde edilen output.txt dosyası (ubuntu'daki gedit ve jedit tarafından) bana şunu veriyor:

[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
...

Gerçekten böyle görünmesi gerektiğinde:

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'
...

Kodlamada bir sorun olabileceğini düşündüm, dosyanın kodlamasını kontrol ettim. file -bi output.txt hangi çıktılar text/plain; charset=us-ascii.

Kodlamayı utf-8 olarak değiştirirsem sorunun çözüleceğini düşündüm, bu yüzden şunu denedim:

clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt

ama bir fark yaratmadı.

Bu sorunu çözmek için ne yapabilirim?

Sorun, sözdizimi ile vurgulanan sürümü görüntülemeye çalışmam değil (ilk etapta görüntülemekte sorun yaşamadım). Clang tarafından oluşturulan AST'yi bir dosyaya kaydetmem ve daha sonra ayrıştırmam gerekir; bu, kalan renk bilgisi için zor olacaktır.


4
Bunu dikkate değer > çıktı oluşturmaz, yalnızca çıktılarınızı koymak istediğiniz kabuğu belirler. clang verilen dosyada komut yerine terminal komutunu kullanın. Bundan sonra, aynı şekilde renk kodlarına izin vermeyecek şekilde görüntülüyorsunuz. Eğer olsaydın cat Terminal devralacak gibi çalışır, ve yapabilirsiniz less aynı şeyi yapmak -R bayrağı.
Sammitch



@Scott - Çıktıyı görüntülemeye çalışmıyorum, dosyayı gereksiz yere karmaşıklaştırmak için renk bilgisinde bırakmadan dosyaya kaydetmeye çalışıyorum.
maou

Yanıtlar:


54

Kod sayfaları / kodlama ile ilgisi yoktur. Çıktınız düz metin değil. Bu gibi dizileri içerir [0;1;32m. Bu karakter dizileri (gösterilmemiştir, bunlardan her birinin önünde [kaçış] karakter vardır), terminale metin kalın, italik, çeşitli renklerde vb. onu destekliyor.

Clang'a çıktıyı güzelleştirmeyi denememesini, bunun yerine düz metni kullanmasını söyleme seçeneği olmalı. El kitabını kontrol et. (Kullanıcım yok, bu yüzden size uygun komutun ne olduğunu söyleyemem.)


15
Teşekkürler, nedeni buydu. denedim clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt Bu bana doğru çıktı verdi.
maou

9
Alternatif bir düzeltme, eğer Clang makul derecede iyi davranırsa (ki açıkça belli değil, kontrol etmeden terminal kodları gönderiyorsa isatty(stdout) ) ayarlamak TERM ila (örn.) dumb.
Toby Speight

4
Re "Eğer terminaliniz destekliyorsa bu, çıktının okunmasıyla sonuçlanır.", Elbette ki bir görüş. Renklendirme uygulaması siyah arka planınıza koyu mavi metin çıktığında olduğu gibi, her zaman bu şekilde çalışmaz :-(
jamesqf

4
Makul bir yazılım parçası çıktısının dosyaya yönlendirildiğini tespit etmeli ve bu durumda renklendirmeyi kapatmalıdır.
n0rd

1
@ n0rd İdeal olarak evet, ancak yönlendirilen çıktıda isattty () işlevinin yanlış verilmediği durumlar gördüm. Bazı durumlarda, kullanıcı kaçış kodlarının yeniden yönlendirilmesini isteyebilir (örneğin daha sonra görüntülemek veya netcat'a başka bir sistemde görüntülemek için, sadece 2 kullanım örneği vermek için). Bu yüzden tahmin etmeye çalışın, ancak kullanıcının hatalı olması durumunda tahminde bulunmak yerine kullanıcının açıp kapamasına izin verin. Bu en iyi çözüm olurdu.
Tonny

12

Alternatif olarak, renkleri çıktıdan çıkarmak yerine, ham seçeneğini kullanarak renkli çıktıyı terminalinizde görüntüleyebilirsiniz. less

less -r output.txt

2

Bu karakterler gibi [0;33m Bana terminal çıkış kontrolü gibi görünüyorsun. Terminaldeki metne renk uygulamak için sıkça kullanılan bir kaçış dizisinin bir parçasıdır. Bu gibi ham haliyle sık sık bash istemine renk uygulamak için de kullanılır - İşte kullandığım şey .bashrc tüm makinelerimde yıllarca:

export PS1='\[\033[1;33m\]\u\[\033[1;35m\]@\[\033[1;32m\]\h\[\033[0;36m\]\w\[\033[1;37m\]\$ \[\033[0;37m\]'

(Çoğu çirkin olduğunu düşünüyor, ama hoşuma gidiyor).

Herhangi bir renk kodunu veya benzerini komutlarınızın çıktısından kaldıracak bir düğme bulabilecek misiniz bir bakın ve bunun yardımcı olup olmadığına bakın.


13
[...] "bash'ın çıkış kontrolü bana benziyor" bash ile ilgisi yok. Onlar için ne terminalidir.
glglgl

1
@Glglgl'ın dediği gibi, onlar Bash'e özgü değiller, onlar bir xterm ile ilgili bir şey. Görmek bu mükemmel cevap lider geliştiricisi tarafından xterm.
cat

@glglgl Tamam, buna göre düzenlenmiş cevap. İlk önce birkaç yıl önce fBSD'den linux'a geçiş yaparken gördüm, bu da bash kullanmaya başladığım zamandı, bu yüzden sonuncusunun bir ürünü olduğunu düşündüm.
Jarmund
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.