string - 如何将带有多个参数的单个字符串传递给std::process::Command?

标签 string rust command-line-arguments child-process

Rust的std::process::Command类型要求通过.arg("-arg1").arg("-arg2")单独传递过程参数,或者通过.args(&["-arg1", "-arg2"])作为字符串向量传递过程参数。如何将字符串拆分为可以作为参数传递的向量?

最佳答案

在将命令行字符串拆分为参数时,shell的作用绝非易事,尤其是当您要处理诸如引用之类的内容时。例如,您的代码应传递以下断言:

assert_eq!(split(r#""foo\"bar""#), vec!["foo\"bar"]);
assert_eq!(split(r#""foo"#), vec!["\"foo"]);          // Or error

除非您认为简单地在空格上拆分就足以满足您的用例,否则您应该真正使用诸如 shell-words shlex 之类的 crate 。 shlex的优势在于它可以返回迭代器,从而避免了不必要的分配,但另一方面,它很容易错过上面第二个测试中的错误:
extern crate shell_words;
extern crate shlex;

use shell_words::split;
use shlex::Shlex;

fn main() {
    assert_eq!(split(r#"a b"#).unwrap(), vec!["a", "b"]);
    let mut lex = Shlex::new(r#"a b"#);
    assert_eq!(lex.by_ref().collect::<Vec<_>>(), vec!["a", "b"]);
    assert!(!lex.had_error);    // ← Don't forget this check!

    assert_eq!(split(r#"a "b c""#).unwrap(), vec!["a", "b c"]);
    let mut lex = Shlex::new(r#"a "b c""#);
    assert_eq!(lex.by_ref().collect::<Vec<_>>(), vec!["a", "b c"]);
    assert!(!lex.had_error);    // ← Don't forget this check!

    assert_eq!(split(r#""foo\"bar""#).unwrap(), vec!["foo\"bar"]);
    let mut lex = Shlex::new(r#""foo\"bar""#);
    assert_eq!(lex.by_ref().collect::<Vec<_>>(), vec!["foo\"bar"]);
    assert!(!lex.had_error);    // ← Don't forget this check!

    assert!(split(r#""foo"#).is_err());
    // assert_eq!(Shlex::new(r#""foo"#).collect::<Vec<_>>(), vec!["\"foo"]);

    let mut lex = Shlex::new(r#""foo"#);
    lex.by_ref().for_each (drop);
    assert!(lex.had_error);     // ← Don't forget this check!
}

关于string - 如何将带有多个参数的单个字符串传递给std::process::Command?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63688057/

相关文章:

string - ActionScript 3 .replace() 仅替换第一个实例

Android - 将字节数组写入 OutputStreamWriter

rust - 将存储在 u32 数组中的大数转换为字节并返回

rust - Rust 的 C++ Friend-like 构造

bash - 用法 : command not found

java - 检查空字符串 null 吗?

c++ - 在 C++ 中将文件中的间隔整数读入数组

rust - Rust 中的 Atbash 密码

c# - 如何在 C# 中执行带参数的命令行

bash - 将可变数量的 bash 命令行参数传递给 MATLAB 函数