You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Rust的Command命令真正输出内容到标准输出(stdout)?

问题原因与解决方法

问题根源

你使用的Command::output()方法核心作用是捕获子进程的标准输出/错误到内存缓冲区,而非让子进程直接将内容输出到当前终端。因此尽管断言能验证缓冲区内容正确,但终端看不到任何输出——所有内容都存在command_example.stdout里,没有被主动打印到终端。

解决方案

根据你的需求,有两种常见处理方式:

1. 让子进程直接输出到终端

如果你不需要捕获子进程的输出,只是想让它像直接在终端执行命令一样输出内容,改用status()或spawn()方法:

使用status()(最简方式)

use std::io;
use std::process::Command;

fn main() {
    let mut some_input = String::new();
    io::stdin()
        .read_line(&mut some_input)
        .unwrap();

    // status()会让子进程直接输出到终端,并等待进程结束
    Command::new("echo")
        .arg(&some_input)
        .status()
        .unwrap();
}

使用spawn()(更灵活,可控制子进程生命周期)

use std::io;
use std::process::Command;

fn main() {
    let mut some_input = String::new();
    io::stdin()
        .read_line(&mut some_input)
        .unwrap();

    let mut child = Command::new("echo")
        .arg(&some_input)
        .spawn()
        .unwrap();
    
    // 等待子进程执行完成
    child.wait().unwrap();
}

2. 捕获输出的同时打印到终端

如果你既需要捕获输出做断言验证,又想让内容显示在终端,可以在断言后手动将缓冲区内容写入标准输出:

use std::io;
use std::io::Write;
use std::process::Command;

fn main() {
    let mut some_input = String::new();
    io::stdin()
        .read_line(&mut some_input)
        .unwrap();

    let command_example = Command::new("echo")
        .arg(&some_input)
        .output()
        .unwrap();

    let expected_output = format!("{}\n", &some_input);
    assert_eq!(expected_output.as_bytes(), command_example.stdout.as_slice());
    
    // 手动将捕获的输出写入终端
    io::stdout().write_all(&command_example.stdout).unwrap();
}

内容的提问来源于stack exchange,提问作者whatf0xx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:14:56