// Run with environment cmd("python script.py") .env("DEBUG", "1") .current_dir("/app") .run()?;
That’s a lot of .arg() calls, and error handling? You're on your own. sbprocess
cargo add sbprocess
rust programming cli devtools subprocess The Problem We've all been there. You just need to run a shell command, capture its output, handle errors gracefully, and maybe pipe a few things together. But the standard library's std::process::Command quickly becomes verbose: // Run with environment cmd("python script
// Capture both stdout and stderr separately let res = cmd("ls /nonexistent").run_unchecked(); println!("err: {}", res.stderr); use sbprocess::pipe; let result = pipe!("echo 'hello world'" | "wc -w").run().unwrap(); assert_eq!(result.stdout.trim(), "2"); With Timeout use sbprocess::cmd; use std::time::Duration; match cmd("sleep 10").timeout(Duration::from_secs(1)).run() { Ok(_) => println!("Finished"), Err(e) => println!("Timed out: {}", e), } Why Not Just Use std::process ? | Feature | std::process | sbprocess | |----------------------|--------------|------------| | String command | ❌ | ✅ | | Auto error messages | ❌ | ✅ | | Piping sugar | ❌ | ✅ | | Timeout | ❌ (manual) | ✅ | | Capture as String | ❌ (Vec ) | ✅ | Installation Add to your Cargo.toml : You just need to run a shell command,
use std::process::Command; let output = Command::new("sh") .arg("-c") .arg("echo hello | grep h") .output() .expect("failed to execute");