2017-08-14 22 views
-1

是否有锈等效类似:是否有比`std :: process :: Command`低一级的接口来执行一个字符串作为一个进程?

os.run("/bin/bash ln -s /dir1 /dir2"); 

我想用类似于一个我会在ptty使用字符串表达式来生成一个进程的能力。

我发现这样做的唯一实用工具是std::process::Command,但它没有很好的记录,似乎太复杂,很难调试。

In Rust, how do I invoke a system command and capture its output?作为答案给出std::process::Command,因此我指定将其作为一个可能的选项。但是,我正在寻找一个较低级别的界面,以使std::process::Command作为查询执行单个字符串,而不是迫使我逐个向它提供参数。

+1

可能重复[在Rust中,我如何调用系统命令并捕获它的输出?](https://stackoverflow.com/questions/21011330/in-rust-how-do-i-invoke-a- system-command-and-capture-its-output) – Malice

+1

@Malice请在报告重复之前阅读帖子,或者解释为什么它是重复的。我特别要求了一个不是std ::的低级接口:: process ::命令 – George

+3

您能否扩展“低级接口”的含义以及为什么需要它?创建一个执行命令的子进程本质上是具有挑战性的,并且容易出错,这可能解释了为什么'std :: process :: Command'对你来说似乎很复杂。我会想象任何更低层次的接口将会同样复杂。至于文档,这对我来说似乎很好 - https://doc.rust-lang.org/std/process/struct.Command.html。如果您有关于docs/using命令的具体问题,请编辑您的问题以解决该问题。 – user1413793

回答

3

不,标准库中没有这样的东西可用。正如在评论中提到的,Command的较低级别的接口。使用单个字符串的壳和其他工具必须非常聪明地解析字符串,以便将其拆分为多个部分。这个解析是不平凡的,并且可能在不同的shell之间有所不同!

你总是可以编写自己的解析器简化,当然:

use std::process::Command; 

fn main() { 
    let args = "ls -l /etc /tmp"; 
    let args: Vec<_> = args.split(" ").collect(); 

    let output = Command::new(args[0]) 
     .args(&args[1..]) 
     .output() 
     .expect("Couldn't run it"); 

    println!("{:?}", ::std::str::from_utf8(&output.stdout)); 
    println!("{:?}", ::std::str::from_utf8(&output.stderr)); 
} 

但它没有很好的记载

我显然有失偏颇,但我不明白怎么回事可能是更多记录在案。每一种有用的方法都有描述它的散文和演示它的例子。

,似乎过于复杂

我不知道为什么;也许选择的数量是压倒性的,但实际上需要控制。

难以调试。

我不确定需要进行哪些调试 - 无论是否编译代码,它都会执行或不执行。编译器错误通常很有用,这种性质的运行时错误通常取决于操作系统。

相关问题