73·标准库深入进阶

进程与命令行

进程与命令行

学习目标

  1. 掌握 Command 执行外部命令
  2. 掌握进程间通信
  3. 理解环境变量

核心概念

执行命令

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()

练习编辑器

rust
Loading...