मैं रस्ट में एक सिस्टम कमांड को कैसे लागू करूं और इसके आउटपुट को कैप्चर करूं?


87

क्या सिस्टम कमांड को लागू करने का एक तरीका है, जैसे lsया fuserजंग में? कैसे इसके उत्पादन पर कब्जा करने के बारे में?

जवाबों:


115

std::process::Command उसके लिए अनुमति देता है।

बच्चे की प्रक्रिया को स्पॉन करने और मशीन पर एक मनमाना कमांड निष्पादित करने के कई तरीके हैं:

  • spawn - कार्यक्रम चलाता है और विवरण के साथ एक मूल्य देता है
  • output - प्रोग्राम चलाता है और आउटपुट देता है
  • status - प्रोग्राम चलाता है और निकास कोड लौटाता है

डॉक्स से एक सरल उदाहरण:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");

2
क्या होगा अगर मुझे रियल-टाइम आउटपुट प्राप्त करने की आवश्यकता है मुझे लगता है कि outputप्रक्रिया पूरी होने के बाद फंक्शन रिटर्न वीईसी। तो, अगर हम ऐसा कुछ चलाते हैं Command("ping google.com")। क्या यह इस कमांड आउटपुट को प्राप्त करना संभव है क्योंकि यह खत्म नहीं होगा लेकिन मैं इसके लॉग को प्रिंट करना चाहता हूं। कृपया सुझाव दे।
ग्रिवटी

3
@GrvTyagi:, spawnइस उत्तर में उल्लिखित, Childमानक I / O धाराओं के साथ परिणाम देता है ।
Ry-

इस उत्कृष्ट उत्तर के निर्माण से, मुझे यह उत्तर यह समझने में मददगार लगा कि स्टड / स्टडआउट के साथ बातचीत कैसे करें।
माइकल नोगुएरा

33

डॉक्स से एक बहुत स्पष्ट उदाहरण :

use std::process::Command;
let output = Command::new("/bin/cat")
                     .arg("file.txt")
                     .output()
                     .expect("failed to execute process");

println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));

assert!(output.status.success());

8

यह वास्तव में संभव है! प्रासंगिक मॉड्यूल है std::run

let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);

ProcessOptionsमानक फ़ाइल डिस्क्रिप्टर डिफ़ॉल्ट रूप सेNone (एक नया पाइप बनाते हैं), इसलिए आप process.output()इसके आउटपुट से पढ़ने के लिए बस (उदाहरण के लिए) का उपयोग कर सकते हैं।

यदि आप कमांड चलाना चाहते हैं और इसके पूरा हो जाने के बाद इसका आउटपुट प्राप्त करना चाहते हैं, तो इसके wait_with_outputलिए है

Process::new, जैसा कि कल, के Option<Process>बजाय एक वापसी करता Processहै, वैसे।


31
सभी खोजकर्ताओं के लिए: std :: run हटा दिया गया है, इसके std::io::processबजाय देखें (नीचे उत्तर)।
१०:५५ पर jgillich

2
यह std::processअब जंगी 1.19.0 के रूप में है।
WiSaGaN
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.