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解析器实现

Download history 5304/week @ 2024-03-14 4608/week @ 2024-03-21 4737/week @ 2024-03-28 4898/week @ 2024-04-04 4984/week @ 2024-04-11 4343/week @ 2024-04-18 3357/week @ 2024-04-25 3647/week @ 2024-05-02 3773/week @ 2024-05-09 3305/week @ 2024-05-16 3216/week @ 2024-05-23 3514/week @ 2024-05-30 3592/week @ 2024-06-06 3462/week @ 2024-06-13 3299/week @ 2024-06-20 2465/week @ 2024-06-27

13,518 每月下载量
用于 89 个 crate (37 直接)

MIT 许可

42KB
450

Execute

CI

此库用于扩展 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

文档

https://docs.rs/execute

许可

MIT

依赖项

~0.5-1MB
~24K SLoC