15 个版本
0.2.13 | 2023 年 11 月 20 日 |
---|---|
0.2.12 | 2023 年 4 月 6 日 |
0.2.11 | 2022 年 5 月 1 日 |
0.2.10 | 2022 年 3 月 10 日 |
0.1.1 | 2020 年 6 月 8 日 |
#717 在 解析器实现
13,518 每月下载量
用于 89 个 crate (37 直接)
42KB
450 行
Execute
此库用于扩展 Command
以便于更轻松执行程序。
用法
use std::process::Command;
use execute::Execute;
// ...
验证程序
由于 Command
用于启动命令的进程,而执行的程序是外部程序,可能不存在或不是我们期望的程序,我们通常需要在运行时验证外部程序。
可以使用 execute_check_exit_status_code
方法执行命令并检查其退出状态。例如,
use std::process::Command;
use execute::Execute;
const FFMPEG_PATH: &str = "/path/to/ffmpeg";
let mut first_command = Command::new(FFMPEG_PATH);
first_command.arg("-version");
if first_command.execute_check_exit_status_code(0).is_err() {
eprintln!("The path `{}` is not a correct FFmpeg executable binary file.", FFMPEG_PATH);
}
执行并获取退出状态
use std::process::Command;
use execute::Execute;
const FFMPEG_PATH: &str = "/path/to/ffmpeg";
let mut command = Command::new(FFMPEG_PATH);
command.arg("-i");
command.arg("/path/to/media-file");
command.arg("/path/to/output-file");
if let Some(exit_code) = command.execute().unwrap() {
if exit_code == 0 {
println!("Ok.");
} else {
eprintln!("Failed.");
}
} else {
eprintln!("Interrupted!");
}
执行并获取输出
输出到屏幕
use std::process::Command;
use execute::Execute;
const FFMPEG_PATH: &str = "/path/to/ffmpeg";
let mut command = Command::new(FFMPEG_PATH);
command.arg("-i");
command.arg("/path/to/media-file");
command.arg("/path/to/output-file");
let output = command.execute_output().unwrap();
if let Some(exit_code) = output.status.code() {
if exit_code == 0 {
println!("Ok.");
} else {
eprintln!("Failed.");
}
} else {
eprintln!("Interrupted!");
}
输出到内存(捕获)
use std::process::{Command, Stdio};
use execute::Execute;
const FFMPEG_PATH: &str = "/path/to/ffmpeg";
let mut command = Command::new(FFMPEG_PATH);
command.arg("-i");
command.arg("/path/to/media-file");
command.arg("/path/to/output-file");
command.stdout(Stdio::piped());
command.stderr(Stdio::piped());
let output = command.execute_output().unwrap();
if let Some(exit_code) = output.status.code() {
if exit_code == 0 {
println!("Ok.");
} else {
eprintln!("Failed.");
}
} else {
eprintln!("Interrupted!");
}
println!("{}", String::from_utf8(output.stdout).unwrap());
println!("{}", String::from_utf8(output.stderr).unwrap());
执行并输入数据
输入内存中的数据
use std::process::{Command, Stdio};
use execute::Execute;
let mut bc_command = Command::new("bc");
bc_command.stdout(Stdio::piped());
let output = bc_command.execute_input_output("2^99\n").unwrap();
println!("Answer: {}", String::from_utf8(output.stdout).unwrap().trim_end());
从读取器输入
use std::process::{Command, Stdio};
use std::fs::File;
use execute::Execute;
let mut cat_command = Command::new("cat");
cat_command.stdout(Stdio::piped());
let mut file = File::open("Cargo.toml").unwrap();
let output = cat_command.execute_input_reader_output(&mut file).unwrap();
println!("{}", String::from_utf8(output.stdout).unwrap());
默认情况下,缓冲区大小为 256 字节。如果您想更改它,可以使用 _reader_output2
或 _reader2
方法并明确指定长度。
例如,要将缓冲区大小更改为 4096 字节,
use std::process::{Command, Stdio};
use std::fs::File;
use execute::generic_array::typenum::U4096;
use execute::Execute;
let mut cat_command = Command::new("cat");
cat_command.stdout(Stdio::piped());
let mut file = File::open("Cargo.toml").unwrap();
let output = cat_command.execute_input_reader_output2::<U4096>(&mut file).unwrap();
println!("{}", String::from_utf8(output.stdout).unwrap());
执行多个命令并将它们连接在一起
use std::process::{Command, Stdio};
use execute::Execute;
let mut command1 = Command::new("echo");
command1.arg("HELLO WORLD");
let mut command2 = Command::new("cut");
command2.arg("-d").arg(" ").arg("-f").arg("1");
let mut command3 = Command::new("tr");
command3.arg("A-Z").arg("a-z");
command3.stdout(Stdio::piped());
let output = command1.execute_multiple_output(&mut [&mut command2, &mut command3]).unwrap();
assert_eq!(b"hello\n", output.stdout.as_slice());
在当前 shell 中运行命令字符串
可以使用 shell
函数使用单个命令字符串而不是程序名和分散的参数来创建 Command
实例。
use std::process::{Command, Stdio};
use execute::{Execute, shell};
let mut command = shell("cat /proc/meminfo");
command.stdout(Stdio::piped());
let output = command.execute_output().unwrap();
println!("{}", String::from_utf8(output.stdout).unwrap());
在运行时解析命令字符串
可以使用 command
函数使用单个命令字符串而不是程序名和分散的参数来创建 Command
实例。与 shell
函数相比,后者由当前 shell 解释,而前者由此 crate 解析。
use std::process::{Command, Stdio};
use execute::{Execute, command};
let mut command = command("cat '/proc/meminfo'");
command.stdout(Stdio::piped());
let output = command.execute_output().unwrap();
println!("{}", String::from_utf8(output.stdout).unwrap());
在编译时解析命令字符串
可以使用 command!
宏使用单个命令字符串字面量而不是程序名和分散的参数来创建 Command
实例。
use std::process::{Command, Stdio};
use execute::Execute;
let mut command = execute::command!("cat '/proc/meminfo'");
command.stdout(Stdio::piped());
let output = command.execute_output().unwrap();
println!("{}", String::from_utf8(output.stdout).unwrap());
通过提供单独的参数创建 Command
实例
可以使用 command_args!
宏使用程序名和参数分别创建 Command
实例。程序名和参数可以是非字面量。
use std::process::{Command, Stdio};
use execute::Execute;
let mut command = execute::command_args!("cat", "/proc/meminfo");
command.stdout(Stdio::piped());
let output = command.execute_output().unwrap();
println!("{}", String::from_utf8(output.stdout).unwrap());
Crates.io
https://crates.io/crates/execute
文档
许可
依赖项
~0.5-1MB
~24K SLoC