首页 > 解决方案 > Rust:有没有办法在第一次输入之前显示标准输出,然后隐藏?

问题描述

我不知道这是否可能,但这是一个场景..

# Call `mysql` from inside a running container named "db"

cargo run my-command "docker exec -it db mysql -u user -p my-database"

这将导致 mysql 命令在密码提示符处暂停执行。然而,在输入密码并按下回车后,Rust 程序应该将一些其他参数(未显示)注入到引用的命令中,最终输出将是一堆文本。

let args = [
   "docker", "exec", "-it", "db", "mysql", "-u", "user", "-p"
];

// `sudo` only used for testing. It's needed for docker,
// but `sudo cargo run ...` doesn't work
let cmd = process::Command::new("sudo")
    .args(&args)
    .spawn() // stdout will be inherited
    .expect("external cmd failed.")
    .wait_with_output()?;

但是,输出将被处理my-command并且不应该显示给用户。

有没有办法在第一个输入时暂停子命令,并将标准输出切换为管道?

我试图在等待孩子完成之前检查输入

// ... snip

let mut cmd = process::Command::new("sudo")
        .args(&args)
        .spawn()
        .expect("external cmd failed.");

let mut s = String::new();
// Trying to inspect the stdout for the if check below,
// but this will panic
let mut out = cmd.stdout.take().unwrap();
out.read_to_string(&mut s);

if s.contains("password") {
    // From now on, don't display child's stdout
}

let output = cmd.wait_with_output()?;

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

// do something with the result

但这似乎只是暂停所有执行,直到按下回车键。

更新

也许孩子的标准输入可以保持继承,但孩子的标准输出可以初始化,.stdout(process::stdio::piped())父母可以以某种方式捕获输出并有条件地显示它?

标签: rustcommand-line-arguments

解决方案


推荐阅读