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 (pelo gedit e jedit no ubuntu) me fornece o seguinte:
[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 realmente deve ficar 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 sai text/plain; charset=us-ascii
.
Eu pensei que talvez se eu mudar 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 não fez diferença.
O que posso fazer para resolver este problema?
O problema não é que estou tentando visualizar a versão destacada pela sintaxe (não tive problemas para visualizá-la). Preciso salvar o AST gerado pelo clang em um arquivo e analisá-lo, o que seria difícil com as informações de cores deixadas no.
>
não gera saída, simplesmente designa para o shell que você deseja colocar a saída do seuclang
comando no arquivo fornecido, em vez do terminal. Depois disso, você a visualiza de uma maneira que não permite códigos de cores da mesma maneira. Se você estivessecat
no arquivo, ele funcionaria como o terminal assumiria, e você podeless
fazer o mesmo com a-R
bandeira.column
comando confundido por escapes de cores ANSI , Impedir sequências de escape ANSI na saída do terminal e Por quecat /dev/urandom
interrompe seu terminal?Respostas:
Não tem nada a ver com páginas de código / codificação. Sua saída não é texto simples. Ele contém as seqüências como
[0;1;32m
. Essas cadeias (existe um caractere [escape], não mostrado, bem antes de cada uma delas) são instruções para o terminal exibir texto em negrito, itálico, em várias cores, etc. Isso resulta em uma saída de leitura mais fácil, se o seu terminal suporta isso.Deve haver uma opção para dizer ao clang para não tentar embelezar a saída, mas use texto sem formatação. Verifique o manual. (Eu não tenho um útil, por isso não posso lhe dizer qual seria o comando adequado.)
fonte
clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt
que me deu a saída correta.isatty(stdout)
) é definidoTERM
como (por exemplo)dumb
.Como alternativa, em vez de remover as cores da saída, você pode visualizar a saída colorida no seu terminal usando a opção bruta de
less
fonte
Esses caracteres, como o
[0;33m
controle de saída do terminal , parecem para mim. Eles fazem parte de um conjunto de seqüências de escape frequentemente usadas para aplicar cores ao texto no terminal. Em seu estado bruto como esse, também é frequentemente usado para aplicar cores ao próprio prompt do bash - Aqui está o que eu venho usando.bashrc
há anos em todas as minhas máquinas:(A maioria acha que é feio, mas eu gosto).
Veja se você consegue encontrar uma opção para remover qualquer código de cores ou similar da saída de seus comandos e veja se isso ajuda.
fonte
xterm
algo relacionado. Veja esta excelente resposta do desenvolvedor principal doxterm
.