2017-08-14 20 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)); 
} 

但它沒有很好的記載

我顯然有失偏頗,但我不明白怎麼回事可能是更多記錄在案。每一種有用的方法都有描述它的散文和演示它的例子。

,似乎過於複雜

我不知道爲什麼;也許選擇的數量是壓倒性的,但實際上需要控制。

難以調試。

我不確定需要進行哪些調試 - 無論是否編譯代碼,它都會執行或不執行。編譯器錯誤通常很有用,這種性質的運行時錯誤通常取決於操作系統。

相關問題