Метод stdout
Метод stdout класса Command настраивает,
куда будет направлен стандартный поток вывода
(standard output) запускаемого дочернего процесса.
По умолчанию вывод наследуется от родительского
процесса и попадает в консоль. Метод позволяет
перехватить этот поток, чтобы затем прочитать его
программно. Параметром метод принимает значение
типа Stdio, например Stdio::piped
для создания канала или Stdio::null
для отбрасывания вывода.
Метод возвращает изменённую ссылку на Command,
что позволяет выстраивать цепочку вызовов.
Синтаксис
command.stdout(cfg)
Пример
Давайте запустим команду echo и перехватим
её стандартный вывод с помощью Stdio::piped:
use std::process::{Command, Stdio};
fn main()
{
let output = Command::new("echo")
.stdout(Stdio::piped())
.output()
.unwrap();
let text = String::from_utf8(output.stdout).unwrap();
println!("{}", text.trim());
}
Результат выполнения кода:
"hello"
Пример
Давайте отбросим стандартный вывод команды
с помощью Stdio::null, чтобы он
не попадал ни в консоль, ни в программу:
use std::process::{Command, Stdio};
fn main()
{
let status = Command::new("echo")
.arg("abcde")
.stdout(Stdio::null())
.status()
.unwrap();
println!("{}", status.success());
}
Результат выполнения кода:
true
Пример
Давайте запустим дочерний процесс с перехваченным
выводом через spawn и прочитаем его
построчно:
use std::process::{Command, Stdio};
use std::io::{BufRead, BufReader};
fn main()
{
let mut child = Command::new("echo")
.arg("12345")
.stdout(Stdio::piped())
.spawn()
.unwrap();
let stdout = child.stdout.take().unwrap();
let reader = BufReader::new(stdout);
for line in reader.lines()
{
println!("{}", line.unwrap());
}
child.wait().unwrap();
}
Результат выполнения кода:
"12345"