rust - 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())
父母可以以某种方式捕获输出并有条件地显示它?
解决方案
推荐阅读
- append - 每月将 csv 文件附加到 Pickle 文件并更新 pickle 文件
- android - Android.mk 是否需要 AndroidManifest.xml?
- c# - 如何在 C# 应用程序中存储 SNMP-V3 凭据
- swiftui - SwiftUI 增加了从内部函数调用查看的延迟
- asp.net - 自定义 IdentityUser ef 核心中的问题
- dolphindb - 如何查看流数据引擎占用的内存大小?
- javascript - 绝对定位的侧边栏在打开时获得额外的边距
- flutter - 使用双 CPU 时 Flutter 构建时间会增加吗?
- salesforce - 有没有办法将列表分配给字段?
- asp.net-core - EF Core - 从每个类型的表迁移到每个层次结构的表