Có cách nào để gọi một lệnh hệ thống, như ls
hoặ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:
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ếtoutput
- chạy chương trình và trả về kết quả đầu rastatus
- chạy chương trình và trả về mã thoátMộ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");
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());
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.
std::io::process
thay vào đó hãy xem (câu trả lời bên dưới).
std::process
hiện là gỉc 1.19.0.
output
hà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ị.