あなたのコードはすでに作品:出力([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が使用されます。出力には色を示すものはありません。
ターミナルに出力していると思って(それによってその出力をカラー化している)、または単にフラグ/設定をgitに渡してコンテンツを使用して、端末の検出に頼っていますか? –
'git'をだましているのはいい考えです。 'git'はstreamがTTYかどうかを確認しますか? (libuvの 'if(uv_guess_handle(1)== UV_TTY)'のようなもの) Ok - 私はそれをだますことにしようとしています(それはまだわかりませんが、遅かれ早かれ解決します)。私の出力にはエスケープコードが含まれており、それらを印刷すると最終的な出力が色づけされますか? –
もしあなたがgitをだますことができたら、あなたの出力は色付けされるべきです(端末で色分けされている場合)。しかし、これはおそらく最も難しいオプションです。 –