Làm cách nào để gọi một lệnh hệ thống trong Rust và nắm bắt đầu ra của nó?


87

Có cách nào để gọi một lệnh hệ thống, như lshoặc fuserở Rust? Làm thế nào về việc nắm bắt đầu ra của nó?

Câu trả lời:


115

std::process::Command cho phép điều đó.

Có nhiều cách để sinh ra một tiến trình con và thực hiện một lệnh tùy ý trên máy:

  • spawn - chạy chương trình và trả về một giá trị với các chi tiết
  • output - chạy chương trình và trả về kết quả đầu ra
  • status - chạy chương trình và trả về mã thoát

Một ví dụ đơn giản từ tài liệu:

use std::process::Command;

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

2
Điều gì xảy ra nếu tôi cần nhận đầu ra thời gian thực. Tôi nghĩ rằng outputhàm trả về Vec sau khi hoàn thành quá trình. Vì vậy, trong trường hợp nếu chúng ta chạy một cái gì đó như Command("ping google.com"). Điều này có thể nhận được đầu ra lệnh này vì nó sẽ không kết thúc nhưng tôi muốn in nhật ký của nó. Hãy đề nghị.
GrvTyagi

3
@GrvTyagi:, spawnđược đề cập trong câu trả lời này, trả về Childkết quả với các luồng I / O tiêu chuẩn.
Ry-

Dựa trên câu trả lời xuất sắc này, tôi cũng thấy câu trả lời này hữu ích để hiểu cách tương tác với stdin / stdout.
Michael Noguera

33

một ví dụ rất rõ ràng từ tài liệu :

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

Nó thực sự là có thể! Các mô-đun liên quan là std::run.

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

ProcessOptions'bộ mô tả tệp tiêu chuẩn được mặc định làNone (tạo một đường ống mới), vì vậy bạn chỉ có thể sử dụng process.output()(ví dụ) để đọc từ đầu ra của nó.

Nếu bạn muốn chạy lệnh và nhận được tất cả đầu ra của nó sau khi hoàn thành, bạn có thểwait_with_output thực hiện điều đó .

Process::new, kể từ ngày hôm qua, trả về một Option<Process>thay vì a Process, bằng cách này.


31
Đối với tất cả người tìm kiếm: std :: run đã bị xóa, std::io::processthay vào đó hãy xem (câu trả lời bên dưới).
jgillich

2
std::processhiện là gỉc 1.19.0.
WiSaGaN 29/07/17
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.