ฉันจะเรียกใช้คำสั่งระบบและจับเอาต์พุตได้อย่างไร


91

มีวิธีเรียกใช้คำสั่งระบบเช่นlsหรือfuserใน Rust หรือไม่? แล้วการจับเอาท์พุทล่ะ?

คำตอบ:


119

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ฟังก์ชันคืนค่า Vec หลังจากเสร็จสิ้นกระบวนการ Command("ping google.com")ดังนั้นในกรณีถ้าเราทำงานบางอย่างเช่น เป็นไปได้ไหมที่จะได้รับเอาต์พุตคำสั่งนี้เนื่องจากจะไม่เสร็จสิ้น แต่ฉันต้องการพิมพ์บันทึก ช่วยแนะนำหน่อยครับ.
GrvTyagi

3
@GrvTyagi: ที่spawnกล่าวถึงในคำตอบนี้จะส่งคืนChildผลลัพธ์ด้วยสตรีม I / O มาตรฐาน
Ry-

จากคำตอบที่ยอดเยี่ยมนี้ฉันยังพบว่าคำตอบนี้มีประโยชน์สำหรับการทำความเข้าใจวิธีโต้ตอบกับ stdin / stdout
Michael Noguera

34

ตัวอย่างที่ชัดเจนมากจากเอกสาร :

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เมื่อวานนี้จะคืนค่า an Option<Process>แทน a Processโดยวิธีการ


31
สำหรับผู้ค้นหาทั้งหมด: std :: run ถูกลบโปรดดูstd::io::processแทน (คำตอบด้านล่าง)
jgillich

2
มันเป็นstd::processในขณะนี้เป็นของ 1.19.0 rustc
WiSaGaN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.