Struct Stdio
struct Stdio(_)
Describes what to do with a standard I/O stream for a child process when
passed to the stdin, stdout, and stderr methods of Command.
Implementations
impl Stdio
fn piped() -> StdioA new pipe should be arranged to connect the parent and child processes.
Examples
With stdout:
use std::process::{Command, Stdio}; let output = Command::new("echo") .arg("Hello, world!") .stdout(Stdio::piped()) .output() .expect("Failed to execute command"); assert_eq!(String::from_utf8_lossy(&output.stdout), "Hello, world!\n"); // Nothing echoed to consoleWith stdin:
use std::io::Write; use std::process::{Command, Stdio}; let mut child = Command::new("rev") .stdin(Stdio::piped()) .stdout(Stdio::piped()) .spawn() .expect("Failed to spawn child process"); let mut stdin = child.stdin.take().expect("Failed to open stdin"); std::thread::spawn(move || { stdin.write_all("Hello, world!".as_bytes()).expect("Failed to write to stdin"); }); let output = child.wait_with_output().expect("Failed to read stdout"); assert_eq!(String::from_utf8_lossy(&output.stdout), "!dlrow ,olleH");Writing more than a pipe buffer's worth of input to stdin without also reading stdout and stderr at the same time may cause a deadlock. This is an issue when running any program that doesn't guarantee that it reads its entire stdin before writing more than a pipe buffer's worth of output. The size of a pipe buffer varies on different targets.
fn inherit() -> StdioThe child inherits from the corresponding parent descriptor.
Examples
With stdout:
use std::process::{Command, Stdio}; let output = Command::new("echo") .arg("Hello, world!") .stdout(Stdio::inherit()) .output() .expect("Failed to execute command"); assert_eq!(String::from_utf8_lossy(&output.stdout), ""); // "Hello, world!" echoed to consoleWith stdin:
use std::process::{Command, Stdio}; use std::io::{self, Write}; let output = Command::new("rev") .stdin(Stdio::inherit()) .stdout(Stdio::piped()) .output()?; print!("You piped in the reverse of: "); io::stdout().write_all(&output.stdout)?; # io::Result::Ok(())fn null() -> StdioThis stream will be ignored. This is the equivalent of attaching the stream to
/dev/null.Examples
With stdout:
use std::process::{Command, Stdio}; let output = Command::new("echo") .arg("Hello, world!") .stdout(Stdio::null()) .output() .expect("Failed to execute command"); assert_eq!(String::from_utf8_lossy(&output.stdout), ""); // Nothing echoed to consoleWith stdin:
use std::process::{Command, Stdio}; let output = Command::new("rev") .stdin(Stdio::null()) .stdout(Stdio::piped()) .output() .expect("Failed to execute command"); assert_eq!(String::from_utf8_lossy(&output.stdout), ""); // Ignores any piped-in inputfn makes_pipe(self: &Self) -> boolReturns
trueif this requiresCommandto create a new pipe.Example
use Stdio; let io = piped; assert_eq!;
impl Debug for Stdio
fn fmt(self: &Self, f: &mut fmt::Formatter<'_>) -> fmt::Result
impl Freeze for Stdio
impl From for Stdio
fn from(file: fs::File) -> Stdio-
Examples
Filewill be converted toStdiousingStdio::fromunder the hood.use File; use Command; // With the `foo.txt` file containing "Hello, world!" let file = open?; let reverse = new .stdin // Implicit File conversion into a Stdio .output?; assert_eq!; # Ok
impl From for Stdio
fn from(inherit: io::Stderr) -> StdioRedirect command stdout/stderr to our stderr
Examples
use io; use Command; # # # if cfg!
impl From for Stdio
fn from(child: ChildStdout) -> StdioConverts a
ChildStdoutinto aStdio.Examples
ChildStdoutwill be converted toStdiousingStdio::fromunder the hood.use ; let hello = new .arg .stdout .spawn .expect; let reverse = new .stdin // Converted into a Stdio here .output .expect; assert_eq!;
impl From for Stdio
fn from(pipe: io::PipeReader) -> Self
impl From for Stdio
fn from(child: ChildStderr) -> StdioConverts a
ChildStderrinto aStdio.Examples
use ; let reverse = new .arg .stderr .spawn .expect; let cat = new .arg .stdin // Converted into a Stdio here .output .expect; assert_eq!;
impl From for Stdio
fn from(inherit: io::Stdout) -> StdioRedirect command stdout/stderr to our stdout
Examples
use io; use Command; # # # if cfg!
impl From for Stdio
fn from(pipe: io::PipeWriter) -> Self
impl From for Stdio
fn from(child: ChildStdin) -> StdioConverts a
ChildStdininto aStdio.Examples
ChildStdinwill be converted toStdiousingStdio::fromunder the hood.use ; let reverse = new .stdin .spawn .expect; let _echo = new .arg .stdout // Converted into a Stdio here .output .expect; // "!dlrow ,olleH" echoed to console
impl From for process::Stdio
fn from(fd: OwnedFd) -> process::StdioTakes ownership of a file descriptor and returns a
Stdiothat can attach a stream to it.
impl From for process::Stdio
fn from(handle: OwnedHandle) -> process::StdioTakes ownership of a handle and returns a
Stdiothat can attach a stream to it.
impl FromRawFd for process::Stdio
unsafe fn from_raw_fd(fd: RawFd) -> process::Stdio
impl FromRawHandle for process::Stdio
unsafe fn from_raw_handle(handle: RawHandle) -> process::Stdio
impl RefUnwindSafe for Stdio
impl Send for Stdio
impl Sync for Stdio
impl Unpin for Stdio
impl UnwindSafe for Stdio
impl<T> Any for Stdio
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Stdio
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Stdio
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for Stdio
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for Stdio
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Stdio
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Stdio
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>