#command #process #dsl #macro #shell #scripting-language

command-macros

使用类似 shell 语法创建 std::process::Command 的宏

19 个版本

使用旧的 Rust 2015

0.2.9 2021 年 6 月 8 日
0.2.7 2019 年 9 月 17 日
0.2.6 2018 年 10 月 9 日
0.2.4 2018 年 7 月 22 日
0.1.5 2016 年 7 月 29 日

#369Rust 模式

Download history 44/week @ 2024-03-11 50/week @ 2024-03-18 48/week @ 2024-03-25 158/week @ 2024-04-01 45/week @ 2024-04-08 28/week @ 2024-04-15 49/week @ 2024-04-22 42/week @ 2024-04-29 34/week @ 2024-05-06 41/week @ 2024-05-13 29/week @ 2024-05-20 24/week @ 2024-05-27 28/week @ 2024-06-03 23/week @ 2024-06-10 28/week @ 2024-06-17 58/week @ 2024-06-24

139 每月下载量
用于 7 crates

MIT 许可证

21KB
238

command-macros

文档, crate

使用类似 shell 语法创建 std::process::Command 的宏。创建此宏是为了使 Rust 作为脚本语言的使用更加愉快。

此包包含两个宏,command!() – 功能齐全,但需要 nightly 版本,以及一个更简单的 cmd!(),由 macro_rules 构建。

command!

Build Status

安装

此宏需要 nightly Rust 和启用 "nightly" 功能。在您的 Cargo.toml 中添加以下内容。

[dependencies.command-macros]
version = "0.2.9"
features = ["nightly"]

然后在您的根模块顶部添加以下内容

#![feature(proc_macro_hygiene)]

extern crate command_macros;

use command_macros::command;

如果您不是运行最新 nightly 版本,请尝试以下版本

nightly 日期 command-macros 版本
2020-05-20 — 0.2.9
2018-10-06 — 2021-06-05 0.2.7
2018-10-06 — 2019-08-27 0.2.6
2018-10-04 — 2018-10-05 0.2.5
2018-07-17 — 2018-10-03 0.2.4
2018-05-17 — 2018-07-16 0.2.3
2018-04-07 — 2018-05-16 0.2.2

示例

command!(
    ffmpeg -i (file)
    -c:v libx264 -preset (preset) [moreargs]
    -c:a copy
    file:(tmpname)
).status().unwrap();

大致相当于运行

std::process::Command::new("ffmpeg")
    .args(&["-i", &file])
    .args(&["-c:v", "libx264", "-preset", &preset])
    .args(moreargs)
    .args(&["-c:a", "copy"])
    .arg(&format!("file:{}", tmpname))
    .status()
    .unwrap();

如您所见,您使用 (expr) 从任意 Rust 表达式创建一个参数(或其一部分),使用 [expr] 创建多个参数。自动添加了 &,类似于 print! 的工作方式。

此外,command! 将正确处理 filetmpname 作为 OsStr,而手动版本则需要一些修改。

此外,您还可以使用 ifif letmatchfor。此代码片段还展示了 (( expr )) 功能。

command!(make
    if let Some(n) = n_cores { -j ((n + 1)) }
).status().unwrap();

这两个宏都通过值返回 Command,因此您可以将其存储在变量中以供以后使用

let cmd = command!(mkv --fs);

如果您已部分准备命令(Command&mut Command),也可以将其传递给此宏

let base: Command = prepare();
let cmd = command!({base} install (package));

cmd!

安装

将以下内容放入您的 Cargo.toml 中。

[dependencies]
command-macros = "0.2"

然后在您的根模块顶部添加以下内容

#[macro_use] extern crate command_macros;

限制

此宏是 command! 的“轻量”版本。差异

  • 错误消息更差。
  • 它对空白字符不敏感。
  • 不支持从任意令牌(例如 -c:a)创建参数(仅支持标识符)。解决方案是使用 Rust 字符串作为表达式:("-c:a")
  • ((expr))(expr) 总是评估为完整的参数(没有像 file:(filename) 这样的技巧)。
  • ifmatchfor 中的表达式必须括在括号内。
  • 不支持 else if(使用 else { if ... } 代替)。

除此之外,所有其他功能都应该正常工作。

示例

command! 部分重写的示例以匹配 cmd! 语法

command!(
    ffmpeg ("-i") (file)
    ("-c:v") libx264 ("-preset") (preset) [moreargs]
    ("-c:a") copy
    (format!("file:{}", tmpname))
).status().unwrap();
command!(make
    if let Some(n) = (n_cores) { ("-j") ((n + 1)) }
).status().unwrap();

变更日志

依赖关系

约 70KB