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 这样的 crate 或 shlex . 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/53498414/

相关文章:

c# - Winform 在文本框中拆分字符串

java - 计算字符串中最长的回文子串

rust - 未找到自定义结构的向量方法 push_all

windows - 我是否需要在程序集中复制命令行参数

c - atoi(s) 和 main 参数有问题。 C

java - JNI - java ArrayList 转换为 c++ std::string*

c - 在 C 中打印字符串数组的元素

assembly - 如何在不影响rip相对寻址的情况下正确链接两个目标文件?

Rust nightly vs beta 版本

windows - .bat 脚本比较两个 Windows 文件夹的内容