Por que o clang gera texto ininteligível quando redirecionado?

20

Estou tentando salvar a saída de um comando em um arquivo. O comando é:

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

No entanto, o arquivo output.txt resultante quando aberto (por gedit e jedit no Ubuntu) me dá isto:

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

Quando deveria ser assim:

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

Eu pensei que poderia ser um problema de codificação, verifiquei a codificação do arquivo, file -bi output.txt , que gera text/plain; charset=us-ascii .

Eu pensei que talvez se eu mudasse a codificação para utf-8 o problema seria corrigido, então eu tentei isso:

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

mas isso não fez diferença.

O que posso fazer para resolver este problema?

O problema não é que eu esteja tentando visualizar a versão destacada da sintaxe (eu não tive problema em visualizá-la). Eu preciso salvar o AST gerado por clang para um arquivo e, em seguida, analisá-lo, o que seria difícil com as informações de cores deixadas em.

    
por maou 28.04.2016 / 14:30

3 respostas

54

Não tem nada a ver com codepages / codificação. Sua saída não é texto simples. Contém as seqüências como [0;1;32m . Essas strings (há um caractere [escape], não mostrado, bem antes de cada uma delas) são instruções para o terminal mostrar texto em negrito, itálico, em várias cores, etc. Isso resulta em uma saída mais fácil de ler, se o seu terminal suporta.

Deve haver uma opção para dizer ao clang para não tentar embelezar a saída, mas use texto simples. Verifique o manual. (Eu não tenho um à mão, então não posso dizer qual seria o comando correto.)

    
por 28.04.2016 / 14:41
12

Alternativamente, em vez de remover as cores da saída, você pode ver a saída colorida em seu terminal usando a opção raw de less

less -r output.txt
    
por 29.04.2016 / 10:45
2

Esses caracteres, como [0;33m , parecem com o controle de saída do terminal para mim. Eles fazem parte de um conjunto de seqüências de escape que é freqüentemente usado para aplicar cores ao texto no terminal. Em seu estado bruto como este, ele também é usado frequentemente para aplicar cor ao próprio prompt do bash - aqui está o que eu tenho usado em .bashrc por anos em todas as minhas máquinas:

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

(a maioria acha que é feio, mas eu gosto disso).

Veja se você consegue encontrar uma opção para remover qualquer código de cores ou algo semelhante da saída dos seus comandos e ver se isso ajuda.

    
por 28.04.2016 / 14:41