执行shell命令

时间:2015-07-28 03:34:42

标签: shell rust

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

import os
cmd = r'echo "test" >> ~/test.txt'
os.system(cmd)

但Rust只有std::process::Command。如何执行像cd xxx && touch abc.txt这样的shell命令?

4 个答案:

答案 0 :(得分:9)

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

如果你真的,迫切地需要用shell调用一些命令,你可以通过直接执行shell来更好地略微(比如使用{{1} }切换为bash)。

如果出于某种原因,上述情况不可行您可以保证您的程序在系统中运行有问题的shell可用用户不会运行任何其他内容...

...然后您就可以像使用常规C一样使用来自systemlibc来电。这算作FFI,因此您可能希望查看{{ 3}}

答案 1 :(得分:4)

每个人都在寻找:

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());
}

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

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

答案 2 :(得分:0)

尝试cmd_lib,它是std :: process的包装,可轻松编写类似于任务的shell脚本:

Process::new("touch abc.txt")
    .current_dir("xxx")
    .wait::<CmdResult>()?;

答案 3 :(得分:0)

对于正在寻找一种方法来为运行命令i的子进程设置当前目录的任何人。 e。在Command::current_dir的某个目录中运行“ ls”。用法:

use std::process::Command;

Command::new("ls")
        .current_dir("/bin")
        .spawn()
        .expect("ls command failed to start");