重定向后,为什么clang会生成难以理解的文本?


20

我正在尝试将命令的输出保存到文件中。该命令是:

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

但是,打开后得到的output.txt文件(由ubuntu上的gedit和jedit)给了我这个:

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

何时真正看起来像这样:

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

我以为可能是编码问题,所以检查了file -bi output.txt输出的文件的编码text/plain; charset=us-ascii

我以为如果将编码更改为utf-8,问题将得到解决,所以我尝试了以下方法:

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

但这并没有改变。

我该怎么做才能解决这个问题?

问题不是我要查看语法突出显示的版本(首先查看它没有问题)。我需要将由clang生成的AST保存到文件中,然后解析它,这对于剩下的颜色信息来说将是困难的。


4
值得注意的是,>它不会生成输出,它只是将希望将clang命令输出放入指定文件(而不是终端)的shell指定。之后,您将以不允许以相同方式使用颜色代码的方式查看它。如果要访问cat该文件,它将像终端将接管一样工作,并且可以less使用该-R标志进行相同的操作。
Sammitch '16



@Scott-我不是要查看输出,而是要在不保留颜色信息的情况下将其保存到文件中,这会使解析文件变得不必要地复杂。
maou

Answers:


54

它与代码页/编码无关。您的输出不是纯文本。它包含类似的序列[0;1;32m。这些字符串(在每个字符串之前都有一个未显示的[escape]字符)是指示终端以各种粗体,斜体,各种颜色显示文本的指令。如果终端,这将使输出更易于阅读支持它。

应该有一个选项告诉clang不要尝试美化输出,而应使用纯文本。检查手册。(我没有一个方便的人,所以我不能告诉您正确的命令是什么。)


15
谢谢,这就是原因。我尝试过clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt,这给了我正确的输出。
maou

9
如果Clang的行为合理(如果不是未经检查就发送终端代码,显然不是),则将其isatty(stdout)设置TERM为(eg)dumb
Toby Speight

4
关于“如果您的终端支持,这将使输出更易于阅读。”,这当然是一种意见。并非总是这样,例如当着色应用程序在黑色背景上输出深蓝色文本时:-(
jamesqf 2016年

4
任何合理的软件都应检测到其输出已重定向到文件,并在这种情况下关闭着色。
n0rd

1
@ n0rd理想情况下是,但是我已经看到很多情况下在重定向输出中未将isattty()设置为false。在某些情况下,用户可能希望重定向代码(例如,稍后查看或通过管道传输到netcat以便在另一个系统上查看,仅给出2个用例)。因此,尝试猜测,但也允许用户打开/关闭它,以防猜测错了。那将是最好的解决方案。
Tonny

12

另外,也可以从终端中查看彩色输出,而不是从输出中去除颜色,而使用 less

less -r output.txt

2

那些字符,例如[0;33m对我来说就像终端输出控件。它们是一组转义序列的一部分,通常用于在终端中为文本添加颜色。在这种原始状态下,它还经常用于为bash提示本身添加颜色-这是我.bashrc多年来在所有机器上使用的东西:

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

(大多数人认为它很丑,但我喜欢它)。

查看您是否能够找到一个从命令输出中删除任何颜色编码等的开关,并查看是否有帮助。


13
[...]“好像bash对我来说是输出控制”它们与bash无关。这是他们所要使用的终端。
glglgl

1
正如@glglgl所说,它们不是特定于Bash的,而是与- xterm相关的。请参阅的主要开发者的出色回答xterm

@glglgl好,答案已相应编辑。几年前从fBSD迁移到linux时,我第一次看到它,当时我也开始使用bash,所以我认为它是后者的产物。
Jarmund
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.