I am trying to execute a command in a shell and get the return value as a string.
The command I'm trying to execute is ps axww | grep mongod | grep -v grep
I've seen solutions over the internet, but they don't explain the code, so it is hard customising it to my needs.
example: how to do a sandwich pipe in rust? & Pipe between two child processes
can someone please provide a solution and go line by line explaining how it works in layman's terms.
Much apreciated :)
CodePudding user response:
What you need is the documentation, where they do explain everything line by line, with thorough examples. Adapted from it, here is your code
use std::process::{Command, Stdio};
use std::str;
fn main() {
let ps_child = Command::new("ps") // `ps` command...
.arg("axww") // with argument `axww`...
.stdout(Stdio::piped()) // of which we will pipe the output.
.spawn() // Once configured, we actually spawn the command...
.unwrap(); // and assert everything went right.
let grep_child_one = Command::new("grep")
.arg("mongod")
.stdin(Stdio::from(ps_child.stdout.unwrap())) // Pipe through.
.stdout(Stdio::piped())
.spawn()
.unwrap();
let grep_child_two = Command::new("grep")
.arg("-v")
.arg("grep")
.stdin(Stdio::from(grep_child_one.stdout.unwrap()))
.stdout(Stdio::piped())
.spawn()
.unwrap();
let output = grep_child_two.wait_with_output().unwrap();
let result = str::from_utf8(&output.stdout).unwrap();
println!("{}", result);
}
See the playground (which of course won't output anything since there is no process called mongod
running...).