执行shell命令

Pei*_* Li 8 shell rust

我想在Rust中执行shell命令.在Python中我可以这样做:

import os
cmd = r'echo "test" >> ~/test.txt'
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)

但鲁斯特只有std::process::Command.我怎么能执行shell命令cd xxx && touch abc.txt呢?

DK.*_*DK. 9

真的应该避免system.它的作用取决于正在使用的shell以及您正在使用的操作系统(您的示例几乎肯定不会在Windows上执行您所期望的操作).

如果你真的迫切需要调用一个shell一些命令,你可以做轻微的只是直接执行壳(如使用更好的-c开关对于bash).

如果由于某种原因,上述情况不可行,您可以保证您的程序只能在有问题的shell可用的系统上运行,并且用户不会运行其他任何东西......

...然后你可以像使用常规C 一样使用system来电libc.这算作FFI,所以你可能想看一下std::ffi::CStr.


S.R*_*S.R 7

每个人都在寻找:

use std::process::Command;

fn main() {
    let output = Command::new("echo")
        .arg("Hello world")
        .output()
        .expect("Failed to execute command");

    assert_eq!(b"Hello world\n", output.stdout.as_slice());
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息和示例,请参阅docs

您想模拟&&std::process::Command有一个status方法返回a Result<T>Result实现and_then。您可以and_then像使用,&&但以更安全的Rust方式使用:)

  • 除了`Command::new ("cd").arg ("foo").status()` 总是会[失败](https://play.integer32.com/?gist=572ca6d0639209b4933d114c151dde71&amp;version=stable&amp;mode=debug)... (2认同)
  • 由于cd不是可执行文件,因此它是内部shell命令,因此不能直接从非shell程序运行。您总是可以执行Command :: new(“ /bin/sh").args(&[”-c“,” cd“,” foo“])`在外壳中运行该命令,但这是一个无操作的操作不会影响通话过程。 (2认同)