Почему clang генерирует неразборчивый текст при перенаправлении?

3733
maou

Я пытаюсь сохранить вывод команды в файл. Команда:

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

Однако полученный файл output.txt при открытии (с помощью gedit и jedit в ubuntu) дает мне следующее:

[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 

но это не имело значения.

Что я могу сделать, чтобы решить эту проблему?

Проблема не в том, что я пытаюсь просмотреть выделенную синтаксисом версию (у меня не было проблем с ее просмотром). Мне нужно сохранить AST, сгенерированный clang, в файл, а затем проанализировать его, что было бы трудно с информацией о цвете, оставшейся в.

20
Стоит отметить, что `>` не генерирует вывод, он просто указывает оболочке, что вы хотите поместить вывод вашей команды `clang` в данный файл, а не в терминал. После этого вы просматриваете его способом, который не разрешает использование цветовых кодов таким же образом. Если вы должны `cat` файл, он будет работать так же, как терминал, и вы можете заставить` less` делать то же самое с флагом `-R`. Sammitch 8 лет назад 4
Возможный дубликат [Как я могу сказать Vim правильно показывать коды выхода ANSI?] (Http://superuser.com/questions/358409/how-can-i-tell-vim-to-show-ansi-escape-codes- должным образом) Scott 8 лет назад 1
См. Также [Обработка управляющих кодов ANSI перед отправкой по трубопроводу] (/ q / 489151/150988), [команда column`, перепутанная с цветовыми побегами ANSI] (/ q / 648665/150988), [Запретить управляющие последовательности ANSI в выводе терминала] (/ q / 170532/150988) и [Почему `cat / dev / urandom` ломает ваш терминал?] (/ q / 637860/150988 # 637867) Scott 8 лет назад 0
@ Scott - Я не пытаюсь просмотреть вывод, я пытаюсь сохранить его в файл, не оставляя в информации о цвете, что сделало бы анализ файла излишне сложным. maou 8 лет назад 0

3 ответа на вопрос

54
Tonny

It has nothing to do with codepages/encoding. Your output isn't plain text. It contains the sequences like [0;1;32m. These strings (there is a, not shown, [escape] character as well before each of these) are instructions to the terminal to show text bold, italics, in various colors, etc. This results in easier to read output, if your terminal supports it.

There should be an option to tell clang not to try to beautify the output, but use plain text instead. Check the manual. (I don't have one handy, so I can't tell you what the proper command would be.)

Спасибо, это было причиной. Я попытался `clang -Xclang -ast-dump -fsyntax-only -fno-color-Diagnicsics main.cpp> output.txt`, который дал мне правильный вывод. maou 8 лет назад 15
Альтернативное исправление, если Clang достаточно хорошо себя ведет (чего, очевидно, нет, если он отправляет терминальные коды без проверки `isatty (stdout)`), - это установить `TERM` в (например)` dumb`. Toby Speight 8 лет назад 9
Re "Это приводит к тому, что вывод легче читать, если ваш терминал его поддерживает.", Это, конечно, мнение. Не всегда так работает, например, когда приложение для раскрашивания выводит темно-синий текст на черном фоне :-( jamesqf 8 лет назад 4
@jamesqf У тебя есть смысл. Темно-зеленый на красном (приложение также установило красный цвет!) - это еще одна неприятность, с которой я столкнулся. Как кто-то думал, что это хорошая идея .. Tonny 8 лет назад 0
Любое разумное программное обеспечение должно обнаружить, что его выходные данные перенаправляются в файл, и в этом случае отключить колоризацию. n0rd 8 лет назад 4
@ n0rd В идеале да, но я видел достаточно ситуаций, когда isattty () не давали false при перенаправленном выводе. А в некоторых случаях пользователь может захотеть перенаправить управляющие коды (например, для просмотра позже или передачи в netcat для просмотра в другой системе, просто для предоставления 2 вариантов использования). Поэтому попытайтесь угадать, но также позвольте пользователю включить / выключить его, отвергая предположение на случай, если оно ошибочно. Это было бы лучшим решением. Tonny 8 лет назад 1
@ n0rd: Да, но, к сожалению, существует множество необоснованных программ. Не только цветной вывод для веб-браузеров: рассмотрим трудности, связанные с отображением, например, MathJax на черном фоне :-( jamesqf 8 лет назад 0
И затем есть идиоты, которые используют `isatty (stdin)`, чтобы определить, могут ли они выводить цветовые коды. Michael Hampton 8 лет назад 0
12
987poiuytrewq

Alternatively, instead of removing the colours from the output, you can view the coloured output in your terminal by using the raw option of less

less -r output.txt 
2
Jarmund

Those characters, such as [0;33m look like terminal output control to me. They're part of a set of escape sequences that is frequently used for applying colors to text in the terminal. In its raw state like this it is also often used for applying color to the bash prompt itself - Here's what I've been using in .bashrc for years on all of my machines:

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

(Most think it's ugly, but I like it).

See if you are able to find a switch to remove any color coding or the like from the output of your commands and see if that helps.

[...] «Похоже, контроль вывода bash для меня» Они не имеют ничего общего с bash. Это терминал для чего они нужны. glglgl 8 лет назад 13
Как сказал @glglgl, они не являются специфичными для Bash, они связаны с `xterm`. См. [Этот превосходный ответ] (http://unix.stackexchange.com/questions/264937/whats-the-maximum-length-for-a-multibyte-escape-sequence) ведущего разработчика `xterm`. cat 8 лет назад 1
@glglgl Хорошо, ответ отредактирован соответственно. Я впервые увидел это при переходе с fBSD на linux несколько лет назад, когда я тоже начал использовать bash, поэтому я подумал, что это продукт последнего. Jarmund 8 лет назад 0

Похожие вопросы