2016-12-30 6 views
4

다른 프로세스 (예 : git status)의 출력을 캡처하여 처리하고 모든 스타일 (굵게, 기울임 꼴, 밑줄) 및 색상으로 인쇄하고 싶습니다. String, 을 추가 처리하는 것은 매우 중요합니다.을 인쇄하기 만하면됩니다.녹에서 어떻게 프로세스 출력물을 색으로 캡처 할 수 있습니까?

유닉스 세계에서 이것은 탈출 코드가 포함될 것이라고 생각합니다. Windows 세계에 대해서는 확신 할 수 없지만 나에게도 중요합니다.

나는 색상없이 작업을 수행하는 방법을 알고

fn exec_git() -> String { 
    let output = Command::new("git") 
     .arg("status") 
     .output() 
     .expect("failed to execute process"); 

    String::from_utf8_lossy(&output.stdout).into_owned() 
} 

아마 내가 대신 spawn를 사용해야합니까?

+0

터미널에 출력하고 있다고 생각해서 바보짓을하는 방법을 찾고 있습니까? (따라서 출력물을 색칠합니다) 단순히 플래그/설정을 git에 전달하여 터미널 탐지에 의존하고 있습니까? –

+0

'git'을 바보 취급하는 것은 좋은 생각 인 것 같습니다. 'git'은 stream이 TTY인지 확인합니다. (libuv의'if (uv_guess_handle (1) == UV_TTY)'와 같은 것) 좋아, 내가 속일 거라고 가정 해보자. (아직 얼마나 모르겠지만 조만간 해결할 것이다.) 그런 다음 내 출력에 이스케이프 코드가 포함되어 인쇄되면 최종 출력이 컬러됩니까? –

+0

git을 속일 수 있다면 출력이 색으로 표시되어야합니다 (터미널에서 색칠 된 경우). 그러나 이것이 가장 어려운 옵션 일 수 있습니다. 어떻게 할 수 있는지 잘 모르겠습니다. –

답변

1

에 코드를 이미 작동 : 출력 ([44;, [0m 등) 내부에 흩어져있는 쓰레기의 무리가 있다는

total 68 
-rw-r--r-- 4 root root 56158 Dec 23 00:00 [0m[44;38;5;15mCargo.lock[0m 
-rw-rw-r-- 4 root root 2093 Dec 9 02:54 [44;38;5;15mCargo.toml[0m 
drwxr-xr-x 1 root root 4096 Dec 30 15:24 [38;5;27msrc[0m 
drwxr-xr-x 1 root root 4096 Dec 23 00:19 [38;5;27mtarget[0m 

참고 :

use std::process::Command; 

fn main() { 
    let output = Command::new("ls") 
     .args(&["-l", "--color"]) 
     .env("LS_COLORS", "rs=0:di=38;5;27:mh=44;38;5;15") 
     .output() 
     .expect("Failed to execute"); 

    let sout = String::from_utf8(output.stdout).expect("Not UTF-8"); 
    let serr = String::from_utf8(output.stderr).expect("Not UTF-8"); 

    println!("{}", sout); 
    println!("{}", serr); 
} 

출력을 인쇄합니다. 그것들은 ANSI escape codes이고, 터미널 에뮬레이터는 다음 텍스트의 색을 변경하기 위해 터미널 에뮬레이터를 해석합니다. 디버깅과 문자열을 인쇄 할 경우

, 당신은 볼 수 있습니다 :

\u{1b}[0m\u{1b}[44;38;5;15mCargo.lock\u{1b}[0m 

각 이스케이프 코드는 ESC (\u{1b})로 시작하는 실제 명령 하였다. 당신은 당신이하고있는 어떤 처리라도 그들을 무시하기 위해 그것을 파싱해야 할 것입니다.

Windows에서는 이스케이프 코드 (maybe it can in Windows 10?)가 사용되지 않고 대신 직접 modifies the console it is connected to 프로그램이 사용됩니다. 색상을 나타낼 출력물이 없습니다.

2

당신이 만 git status 작동 git -c color.status=always status

use std::process::Command; 

fn main() { 
    let output = Command::new("git") 
     .arg("-c") 
     .arg("color.status=always") 
     .arg("status") 
     .output() 
     .expect("failed to execute process"); 

    let output = String::from_utf8_lossy(&output.stdout).into_owned(); 

    println!("{}", output); 
} 

를 사용하여 출력 색상에 자식을 강제 할 수 있습니다. 보다 일반적인 해결책으로는 프로그램 설명서를 확인하고 색상 출력을 강제 실행하거나 색상을 출력할지 여부를 프로그램이 결정하는 방법 (예 : COLORTERM 환경 변수 확인)이 있는지 확인해야합니다.