#unix-shell #processes #pipe #spawned #chains #syntax #into-pipe-setup

废弃 ubend

一个小型库,允许您使用类似于Unix shell的语法在启动的过程之间构建管道链

6个版本

使用旧的Rust 2015

0.2.2 2022年4月24日
0.2.1 2018年9月16日
0.1.2 2018年9月15日

#5 in #spawned

每月 39 次下载

MIT 许可证

52KB
1.5K SLoC

deprecated

U-Bend

这是一个小型库,允许您使用类似于Unix shell的语法在启动的过程之间构建管道链。

#[macro_use] extern crate ubend;
use ubend::IntoPipeSetup;

let output = ubend!(
		cat <"./tests/input.txt" |
		grep "spam" |
		wc "-l"
	).expect("spawn failed").
	output().
	expect("reading output failed").
	stdout;

let output = String::from_utf8(output).
	expect("UTF-8 error").
	trim().
	parse::<i64>().
	unwrap();

println!("output: {}", output);

请注意,命令的参数需要始终引用。如果您不引用它们,它们将被解释为Rust标识符,这允许您传递动态字符串。另外,FOO="bar" cat <"baz"FOO = "bar" cat < "baz" 相同,因为在Rust中忽略空白。

当传递文件名或将 std::fs::File 作为重定向源/目标时,需要 use ubend::IntoPipeSetup

注意: 目前仅测试了Linux。其他Unix操作系统也可能工作,但Windows支持尚未实现。

API文档

更多示例

#[macro_use] extern crate ubend;
use ubend::IntoPipeSetup;
use ubend::PipeSetup::*;

use std::fs::File;
use std::io::{Read, Seek, SeekFrom};

// Ignore stderr
ubend!(rm "no_such_file" 2>Null);

// Redirect stderr to stdout
ubend!(rm "no_such_file" 2>&1);

// Write stderr to stderr of this process
ubend!(rm "no_such_file" 2>Inherit);

// Read from a file opened in Rust
let file = File::open("./tests/input.txt").
	expect("couldn't open file");
ubend!(grep "spam" <file);

// Write stderr to a temp file
let mut chain = ubend!(rm "no_such_file" 2>Temp).
	expect("spawn failed");

chain.wait_last().
	expect("wait failed");

let mut temp = chain.stderr().unwrap();

// Since the file descriptor was shared with the spawned process the
// position needs to be reset manually:
temp.seek(SeekFrom::Start(0)).
	expect("seek failed");

依赖项

~43KB