Estoy tratando de guardar la salida de un comando en un archivo. El comando es:
clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt
Sin embargo, el archivo resultante output.txt cuando se abre (por gedit y jedit en ubuntu) me da esto:
[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
...
Cuando realmente debería verse así:
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'
...
Pensé que podría ser un problema de codificación, verifiqué la codificación del archivo, file -bi output.txtque sale text/plain; charset=us-ascii.
Pensé que si cambiaba la codificación a utf-8, el problema se solucionaría, así que intenté esto:
clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt
Pero no hizo la diferencia.
¿Qué puedo hacer para resolver este problema?
El problema no es que estoy tratando de ver la versión resaltada de sintaxis (no tuve problemas para verla en primer lugar). Necesito guardar el AST generado por clang en un archivo y luego analizarlo, lo que sería difícil con la información de color que queda.

>no genera salida, simplemente designa al shell que desea colocar la salida de suclangcomando en el archivo dado, en lugar de la terminal. Después de eso, lo está viendo de una manera que no permite códigos de color de la misma manera. Si estuviera encatel archivo, funcionaría ya que la terminal se haría cargo, y puede hacerlesslo mismo con la-Rbandera.columncomando confundido por escapes de color ANSI , Prevenir secuencias de escape ANSI en la salida del terminal y ¿Por quécat /dev/urandomrompe su terminal?Respuestas:
No tiene nada que ver con las páginas de códigos / codificación. Su salida no es texto sin formato. Contiene las secuencias como
[0;1;32m. Estas cadenas (hay un carácter [escape], no mostrado, antes de cada una de estas) son instrucciones para que el terminal muestre texto en negrita, cursiva, en varios colores, etc. Esto da como resultado una salida más fácil de leer, si su terminal lo apoyaDebería haber una opción para decirle a clang que no intente embellecer la salida, sino que utilice texto sin formato. Consulta el manual. (No tengo uno a mano, así que no puedo decirte cuál sería el comando adecuado).
fuente
clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txtque me dio la salida correcta.isatty(stdout)) es establecerTERMen (por ejemplo)dumb.Alternativamente, en lugar de eliminar los colores de la salida, puede ver la salida de color en su terminal utilizando la opción sin procesar de
lessfuente
Esos caracteres, como el
[0;33mcontrol de salida de terminal para mí. Forman parte de un conjunto de secuencias de escape que se utilizan con frecuencia para aplicar colores al texto en el terminal. En su estado bruto como este, también se usa a menudo para aplicar color al indicador de bash en sí mismo: esto es lo que he estado usando.bashrcdurante años en todas mis máquinas:(La mayoría piensa que es feo, pero me gusta).
Vea si puede encontrar un interruptor para eliminar cualquier código de color o similar de la salida de sus comandos y vea si eso ayuda.
fuente
xtermrelacionado. Vea esta excelente respuesta del desarrollador principal dexterm.