进程与命令行
学习目标
- 掌握
Command 执行外部命令
- 掌握进程间通信
- 理解环境变量
核心概念
执行命令
use std::process::Command;
fn main() -> std::io::Result<()> {
let output = Command::new("echo")
.arg("Hello, World!")
.output()?;
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
let output = Command::new("ls")
.arg("-la")
.current_dir("/tmp")
.output()?;
println!("stdout:\n{}", String::from_utf8_lossy(&output.stdout));
println!("stderr:\n{}", String::from_utf8_lossy(&output.stderr));
println!("status: {}", output.status);
Ok(())
}
管道
use std::process::{Command, Stdio};
fn main() -> std::io::Result<()> {
let output = Command::new("echo")
.arg("hello world")
.stdout(Stdio::piped())
.spawn()?;
let grep = Command::new("grep")
.arg("world")
.stdin(output.stdout.unwrap())
.output()?;
println!("{}", String::from_utf8_lossy(&grep.stdout));
Ok(())
}
环境变量
use std::env;
fn main() {
match env::var("HOME") {
Ok(val) => println!("HOME: {}", val),
Err(_) => println!("HOME 未设置"),
}
env::set_var("MY_VAR", "hello");
for (key, value) in env::vars() {
println!("{}={}", key, value);
}
let args: Vec<String> = env::args().collect();
println!("参数: {:?}", args);
println!("当前目录: {:?}", env::current_dir().unwrap());
}
退出码
use std::process;
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
eprintln!("用法: {} <name>", args[0]);
process::exit(1);
}
println!("Hello, {}!", args[1]);
}
小结
| 操作 | API |
|---|
| 执行命令 | Command::new().output() |
| 管道 | Stdio::piped() |
| 环境变量 | env::var, env::set_var |
| 命令行参数 | env::args() |
| 退出 | process::exit() |