std::process::Command 是 Rust 標準庫中用于創建和配置子進程的主要類型。它允許你啟動新的進程、設置其參數和環境變量、重定向輸入/輸出等。
基本用法
use std::process::Command;let output = Command::new("echo").arg("Hello, world!").output().expect("Failed to execute command");println!("{}", String::from_utf8_lossy(&output.stdout));
主要功能
- 創建命令:
- Command::new(“可執行文件路徑”) - 創建一個新的命令構建器
- 添加參數:
-
.arg(“參數”) - 添加單個參數
-
.args(&[“參數1”, “參數2”]) - 添加多個參數
- 執行命令:
-
.output() - 執行命令并等待完成,收集所有輸出
-
.status() - 執行命令并等待完成,返回退出狀態
-
.spawn() - 啟動命令并返回子進程句柄,不等待完成
- 環境配置:
-
.env(“KEY”, “value”) - 設置環境變量
-
.env_remove(“KEY”) - 移除環境變量
-
.env_clear() - 清除所有環境變量
- 工作目錄:
- .current_dir(“路徑”) - 設置子進程的工作目錄
- 輸入/輸出重定向:
-
.stdin(Stdio::piped()) - 重定向標準輸入
-
.stdout(Stdio::piped()) - 重定向標準輸出
-
.stderr(Stdio::piped()) - 重定向標準錯誤
示例
執行命令并獲取輸出
let output = Command::new("ls").arg("-l").arg("-a").output().expect("ls command failed to start");
管道輸入
use std::process::{Command, Stdio};let mut child = Command::new("grep").arg("hello").stdin(Stdio::piped()).stdout(Stdio::piped()).spawn().expect("failed to spawn child");let mut stdin = child.stdin.take().expect("failed to get stdin");
std::thread::spawn(move || {stdin.write_all("hello world\ngoodbye\n".as_bytes()).expect("failed to write to stdin");
});let output = child.wait_with_output().expect("failed to wait on child");
錯誤處理
match Command::new("nonexistent_command").output() {Ok(output) => {// 處理成功情況}Err(e) => {eprintln!("執行命令失敗: {}", e);}
}
安全注意事項
-
Command 會繼承父進程的環境變量,這可能帶來安全風險
-
構建命令時,參數應該來自可信源或經過適當轉義
-
在 Windows 上,參數傳遞的行為可能與 Unix 系統不同
Command 提供了強大而靈活的子進程管理功能,是 Rust 中與系統交互的重要工具之一。