IT TIP

색상 화 된 출력을 셸 리디렉션을 통해 캡처 할 수 있습니까?

itqueen 2020. 11. 1. 19:03
반응형

색상 화 된 출력을 셸 리디렉션을 통해 캡처 할 수 있습니까?


내가 사용하는 다양한 bash 명령-멋진 diffs, 빌드 스크립트 등은 많은 색상 출력을 생성합니다.

나는 파일이 출력 한 후 리디렉션 할 때 cat또는 less나중에 파일의 컬러화는 사라입니다 - 변경 색상에 터미널을 말해 색상 코드를 제거 출력을 리디렉션의 아마 B / C 행위.

채색을 포함하여 채색 된 출력을 캡처하는 방법이 있습니까?


색상 화 된 출력을 캡처하는 한 가지 방법은 script명령을 사용하는 것입니다. 실행 script하면 모든 원시 출력이 파일에 캡처되는 bash 세션이 시작됩니다 ( typescript기본 이름이 지정됨 ).


리디렉션은 색상을 제거하지 않지만 많은 명령이 출력을 터미널로 보낼 때 감지하고 그렇지 않은 경우 기본적으로 색상을 생성하지 않습니다. 예를 들어 Linux ls --color=auto( ls많은 곳에서 일반 별칭으로 별칭이 지정됨 )에서는 파이프 나 파일로 출력하면 색상 코드가 생성되지 않지만 ls --color그렇게됩니다. 다른 많은 도구에는 색상 화 된 출력을 파일에 저장하기 위해 유사한 재정의 플래그가 있지만 모두 개별 도구에 따라 다릅니다.

파일에 색상 코드가있는 경우에도 색상 코드를 그대로 유지하는 도구를 사용해야합니다. "원시"모드에서 파일 데이터를 표시 less하는 -r플래그가 있습니다. 이것은 색상 코드를 표시합니다. 편집 : 약간 최신 버전에는 색상 코드를 구체적으로 인식하고 올바르게 표시하는 -R 플래그가 있으며 원시 모드보다 줄 바꿈 / 트리밍과 같은 것을 더 잘 지원합니다. 화면으로 이동합니다.


다른 답변에서 영감을 받아 script. -c그래도 작동 하도록 사용해야 했습니다. tee다른 script예제를 포함한 다른 모든 답변 은 저에게 효과적이지 않았습니다.

문맥:

  • Ubuntu 16.04
  • behave파이썬으로 테스트하는 동안 동작 테스트 실행 및 쉘 명령 시작subprocess.check_call()

해결책:

script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"

스위치 설명 :

  • --flush 그렇지 않으면 출력이 실시간으로 관찰되지 않고 큰 덩어리로 나오기 때문에 필요했습니다.
  • --quiet 스크립트 도구의 자체 출력을 억제합니다.
  • -c, --command 실행할 명령을 직접 제공합니다. 명령에서 스크립트로 파이핑이 작동하지 않았습니다 (색상 없음).
  • --return 내 명령이 실패했는지 알 수 있도록 스크립트가 내 명령의 종료 코드를 전파하도록

일부 프로그램은 출력이 TTY가 아님을 인식 할 때 (즉, 다른 프로그램으로 리디렉션 할 때) 색상 화를 제거합니다. 그들 중 일부는 강제로 색상을 사용하도록 지시하고 호출기에 색상 화를 켜도록 지시 할 수 있습니다.less -R


나는 적은 것이 상호 작용하기 때문에 script파이핑 할 때 색상을 보존 하는 데 사용 하는 less것이 실제로 작동하지 않는다는 것을 발견했습니다 (적은 것은 모두 엉망이고 종료시 bash는 모두 엉망입니다). 나간 후에도 script입력이 정말 엉망이 된 것 같습니다 stdin.

따라서 실행하는 대신 :

script -q /dev/null cargo build | less -R

나는 /dev/null덜 배관하기 전에 그것을 리디렉션 합니다.

script -q /dev/null cargo build < /dev/null | less -R

그래서 이제는 내가 원하는 것을 script엉망으로 만들지 않고 stdin정확하게 얻습니다. 동일 command | less하지만 파일에 추가 된 새 콘텐츠를 계속 읽으면서 색상을 유지합니다 (내가 시도한 다른 방법으로는 그렇게하지 않음).


수퍼 유저에 대한이 질문다른 답변 (포함 tee)이 작동하지 않을 때 도움이되었습니다 . unbuffer명령이 쉘에서 실행되고 있다고 생각하게 만드는 데 사용 합니다.

sudo apt install expect tcl대신 을 사용하여 설치했습니다 sudo apt-get install expect-dev.

apt역설적이게도 의 출력을 리디렉션 할 때이 방법을 사용해야했습니다 .


나는 사용 tee: 명령의 출력을 파이프 teefilename하고 색상을 유지합니다. 그리고 당신은 (무엇을 화면에 출력을 표시하지 않으려면 tee를위한 것입니다 보여주는 동시에 출력을 리디렉션) 다음 단지의 출력을 전송 tee로를 /dev/null:

command| teefilename> /dev/null

참고 URL : https://stackoverflow.com/questions/3515208/can-colorized-output-be-captured-via-shell-redirect

반응형