我想在 Rust 中执行shell命令。在 Python 中,我可以这样做:
import os
cmd = r'echo "test" >> ~/test.txt'
os.system(cmd)
但Rust只有std::process::Command
。如何执行像cd xxx && touch abc.txt
这样的shell命令?
答案 0 :(得分:9)
你应该真的避免system
。它的作用取决于正在使用的shell以及您正在使用的操作系统(您的示例几乎肯定会赢得您在Windows上的期望)。
如果你真的,迫切地需要用shell调用一些命令,你可以通过直接执行shell来更好地略微(比如使用{{1} }切换为bash)。
如果出于某种原因,上述情况不可行和您可以保证您的程序仅在系统中运行有问题的shell可用和用户不会运行任何其他内容...
答案 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::Command
有status
方法,可返回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");