#command #command-arguments #boilerplate #process #shell-like #clutter #echo

humane_commands

允许您编写更多类似于 shell 的命令

3 个版本

0.1.2 2024 年 3 月 23 日
0.1.1 2024 年 3 月 23 日
0.1.0 2024 年 3 月 19 日

#2 in #shell-like

MIT/Apache

20KB
391 代码行(不含注释)

在调用 std::process::Command 时,可以删除很多杂乱无章的样板代码。

使用 cmd! 宏创建 std::process:Command 结构体,使用 exec!run! 直接通过 status()output() 分别执行它们。

run!(echo "Hello World!");
# equivalent to
Command::new("echo").arg("Hello World1").output();

默认情况下,所有参数都将被视为空格分隔的字符串。如果您的参数包含空格,请将其用引号括起来,如上所示。

要使用现有变量作为参数,请将变量的名称用花括号括起来。您可以混合不同类型的参数(与 .args() 方法不同)。

run!(echo (some_str) (some_string) (some_path));
# equivalent to
Command::new("echo").arg(some_str).arg(some_string).arg(some_path).output();

如果您的变量是可迭代的,您可以使用 .. 来展开它。

run!(echo Hello (worlds..))

如果您的参数是可选的,您可以使用 ? 来仅将其附加到值为 Some 的情况下。

let name = Some("Steve");
run!(echo Hello (name ?));

如果您在相同的花括号内包含一个字面量,该字面量也仅当值为 Some 时才包含(用于标志)。这也适用于可迭代对象。

let packages = vec!["cowsay", "emacs"];
run!(echo Installing ("-p" packages ?));

使用 args! 宏将参数附加到现有 Command,使用与 cmd! 相同的语法。

fn my_function(mut cmd: Command) -> Command {
    cmd.args(args!(some new args here));
    cmd
}

扩展

status()output() 的返回值上使用 cmd_ok() 方法来创建一个 Err(),它在 IO 失败和任何退出代码(除了 0)的情况下都会出现,后者将包括 stderr 的内容(如果可用)。

run!(echo test).cmd_ok()?

使用 opt_arg 向您的命令传递可选值,并且只有在它们是 Some 时才使用它们。

请使用 output.stdout()output.stderr()output.stdout_lossy()output.stderr_lossy() 来替代 String::from_utf8(output.stdout)

依赖关系

~120KB