다른 프로세스로 파이프 할 때 ANSI 이스케이프 코드는 어디로 이동합니까? 보관할 수 있습니까?


36

예를 들어 프로세스에 따라 색상으로 구분 된 출력을 파이프하려고합니다. grep ...하지만 파이프를 다른 프로세스에 파이프하면 sed, 색상 코드가 손실됩니다 ...

thes 코드를 그대로 유지하는 방법이 있습니까?

다음은 컬러 출력을 잃는 예입니다.

echo barney | grep barney | sed -n 1,$\ p   

4
PS .. 일반 정보로 .. 방금 less채색 된 텍스트 입력 (nice :)을 받아 들일 수 있음을 발견했습니다 . 예 : tree -C ~/ |less -R또는ls -lR --color=always . |less -R
Peter.O

답변:


40

컬러 출력을 생성하는 많은 프로그램은 TTY에 쓰고 있는지 감지하고 그렇지 않으면 컬러를 끕니다. 텍스트 만 캡처 할 때 색상 코드가 성가 시므로 "올바른 일"을 자동으로 시도합니다.

이와 같은 프로그램에서 색상 출력을 캡처하는 가장 간단한 방법은 TTY에 연결되어 있지 않아도 색상을 쓰도록 지시하는 것입니다. 해당 옵션이 있는지 확인하려면 프로그램 설명서를 읽어야합니다. (예를 들어, grep--color=always옵션을 선택합니다.)

expect스크립트 unbuffer를 사용하여 다음과 같이 의사 -tty를 만들 수도 있습니다 .

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
TTY 감지 및 버퍼 해제 가짜에 대한 정보를 주셔서 감사합니다!
shellter

@cjm .. 여기에서 작동하지 않습니다 (Ubuntu 10.04 / bash 4.1.5에서) ...하지만 내 10.04 저장소에는 -dev 버전 만 있고 백 포트에는 아무것도 없습니다 ... 여기서 늦었습니다. 내일 다시 ...하지만 당신이 말했듯이,이 채색 프로그램은 아마도 출력 대상에 따라 토글 될 것입니다 (mhhh 그러나 그것이 tty .. 상관 없음) 어떻게 알 수 있습니까? it .. 감사합니다.
Peter.O

@fred, 그들은 일반적으로 어디로 가고 있는지 알아 내기 위해 isatty 를 사용 stdout합니다. 나는 unbuffer당신이 프로그램뿐만 아니라 프로그램으로 파이프를 연결할 때 실제로 작동 하는지 확실하지 않습니다 . 시도하기 위해 여기에 설치되어 있지 않습니다.
CJM

unbuffer정보 덕분 에 쉘의 출력과 같은 IRC 봇의 출력에 도움이됩니다.
LiuYan 刘 研

4

그것은 나를 위해 작동합니다;-! (현재 MingW 환경에서)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# 바니 빨간색 텍스트로 표시

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@ shellter ... 예,이 grep 예제도 저에게 효과적입니다. 답변을 게시 할 때까지 해당 옵션을 알지 못했습니다. 감사합니다 ... 그러나. 이 작업을 수행 하는 일반적인 방법 이 있는지 궁금합니다 .... 예 : tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Maybe (?) 파이프가 TTY로 출력되고 있다고 생각하도록 속이는 방법이 있습니다. .
Peter.O

방금 확인했습니다 man tree... 비슷한 옵션이 있습니다 -C. 아마도 컬러 이스케이프 코드를 출력하는 프로그램의 일반적인 기능
Peter.O
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.