Rust如何以用户友好格式打印Command输出的stdout字符串内容
原因说明
std::process::Command执行命令返回的Output结构体中,stdout和stderr字段的类型都是Vec<u8>,也就是存储原始字节的数组。你使用{:?}调试格式符直接打印这个字段时,Rust会默认按照字节数组的调试逻辑输出每个u8数值,不会自动转换为人类可读的字符串。
你之前直接打印整个result变量能看到字符串内容,是因为Output类型的Debug特征实现内部做了特殊处理,会把字节数组转义成字符串形式展示,但单独打印Vec<u8>类型的字段不会触发这个逻辑。
解决方法
根据你对编码合法性的要求,选对应方式即可:
- 通用场景(推荐):用
String::from_utf8_lossy()转换,遇到不合法的UTF-8字节会自动替换为�占位符,不会触发崩溃,适配绝大多数命令行输出场景
use std::process::Command; fn main() { let result = Command::new("git") .arg("status") .output() .expect("命令执行失败"); // 传入字节数组的切片做转换 let stdout_content = String::from_utf8_lossy(&result.stdout); // 用{}格式符直接打印,不要用{:?},否则会显示转义符和引号 print!("{}", stdout_content); }
- 严格校验场景:如果要求输出必须是完全合法的UTF-8,遇到非法字节就抛出错误,可以用
String::from_utf8(),该方法返回Result类型需要手动处理错误
use std::process::Command; fn main() { let result = Command::new("git") .arg("status") .output() .expect("命令执行失败"); match String::from_utf8(result.stdout) { Ok(content) => print!("{}", content), Err(e) => eprintln!("解析命令输出失败,存在非UTF-8字符: {}", e), } }
注意:打印转换后的字符串时要用
{}格式占位符,不要用{:?}。{:?}是调试输出格式,会给字符串加引号、把换行显示成\n转义字符,无法得到和终端直接执行git status一致的展示效果。
内容的提问来源于stack exchange,提问作者Lucas Lima
相关产品推荐
相关产品推荐

