首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用- as stdin/stdout

使用- as stdin/stdout
EN

Stack Overflow用户
提问于 2022-01-05 22:42:05
回答 1查看 420关注 0票数 3

许多命令行工具允许您使用-作为标准输入或标准输出。有什么惯用的方法来支持这一点吗?

看起来,处理命令行参数的最常用方法是clap。如果我只想处理路径,而donʼ不想使用特例ʼ,我可以使用

代码语言:javascript
复制
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;

use clap::Parser;

#[derive(clap::Parser, Debug)]
struct Args {
    #[clap(parse(from_os_str))]
    output: PathBuf,
}

fn main() -> std::io::Result<()> {
    let args = Args::parse();
    let mut file = File::create(args.output)?;
    file.write_all(b"Hello, world!")?;
    Ok(())
} 

但是,要处理-是stdout的情况,ʼ要复杂得多。file的类型现在需要是Box<dyn Write>,因为stdout()不是File,正确设置stdout()有点复杂。这并不难,但这种样板需要多次复制,而且很容易搞砸。

有什么惯用的方法来处理这件事吗?

EN

回答 1

Stack Overflow用户

发布于 2022-01-05 22:59:00

这是您只需在代码中写入的内容。在许多情况下,不清楚-应该表示标准输入还是标准输出,它需要程序的上下文才能正确地解释它。

实际上,在这种情况下,您需要使用Box<dyn Write> (或&dyn Write或类似的)。如果使用Unix,可以通过使用File (以及类似但不完全相同的FromRawFd )创建一个标准输入或输出来创建一个File对象,但是您应该避免这样做,因为当您删除File时,文件描述符是关闭的,这不是正确的行为。

事实上,不小心关闭一个标准文件描述符实际上会导致数据损坏,因为如果打开另一个文件,它将以尽可能低的值打开(例如,1,用于标准输出),然后像println!这样的东西可能会意外地打印到新打开的文件中。

所以在这里使用dyn Write是正确的选择。在大多数情况下,性能影响并不明显。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70600456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档