리디렉션 할 때 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. 단말기보다는 주어진 파일에 명령 의 출력을 넣으려는 쉘을 지정합니다 . 그 후에는 동일한 방식으로 색상 코드를 허용하지 않는 방식으로보고 있습니다. 당신이 인 경우에 cat파일 단말기가 이상 걸릴로 작동 것입니다, 당신은 할 수 less와 동일 할 -R플래그.
Sammitch



@Scott-출력을 보려고하지 않고 색상 정보를 남기지 않고 파일에 저장하려고하므로 파일 구문 분석이 불필요하게 복잡해집니다.
maou

답변:


54

코드 페이지 / 인코딩과는 아무런 관련이 없습니다. 출력물이 일반 텍스트가 아닙니다. 같은 시퀀스를 포함합니다 [0;1;32m. 이 문자열들 (각각 앞에 표시되지 않은 [이스케이프] 문자가 있습니다)은 텍스트 굵은 체, 이탤릭체, 다양한 색상 등을 표시하는 터미널에 대한 지시 사항입니다. 따라서 터미널의 경우 출력을보다 쉽게 ​​읽을 수 있습니다. 그것을 지원합니다.

clang에게 출력을 아름답게 만들지 말고 대신 일반 텍스트를 사용하도록 지시하는 옵션이 있어야합니다. 설명서를 확인하십시오. (핸디가 없기 때문에 적절한 명령이 무엇인지 말할 수 없습니다.)


15
고마워요, 그게 원인이었습니다. 나는 clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txt올바른 출력을 주었다.
maou

9
Clang이 합리적으로 잘 작동하는 경우 (확인하지 않고 터미널 코드를 보내는 경우에는 그렇지 않은) 대체 수정 isatty(stdout)TERM(예) 로 설정 됩니다 dumb.
Toby Speight

4
다시 "단말기에서 지원하는 경우 출력을보다 쉽게 ​​읽을 수 있습니다."즉, 의견입니다. 예를 들어 채색 앱이 검은 색 바탕에 진한 파란색 텍스트를 출력 할 때와 같이 항상 그런 식으로 작동하지는 않습니다 :-(
jamesqf

4
합리적인 소프트웨어는 출력이 파일로 리디렉션되고 있음을 감지하고이 경우 색상을 끕니다.
n0rd

1
@ n0rd 이상적으로는 그렇습니다. 그러나 리디렉션 된 출력에서 ​​isattty ()가 거짓으로 주어지지 않은 충분한 상황을 보았습니다. 경우에 따라 사용자는 이스케이프 코드를 리디렉션 (예 : 나중에 보거나 다른 시스템에서보기 위해 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.
cat

@glglgl 좋아요, 대답은 그에 따라 편집되었습니다. 몇 년 전에 fBSD에서 리눅스로 마이그레이션 할 때 처음 보았습니다 .bash를 사용하기 시작했을 때였습니다. 그래서 후자 제품이라고 생각했습니다.
Jarmund
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.