Struct Exec

Source
pub struct Exec { /* private fields */ }
Expand description

A builder for Popen instances, providing control and convenience methods.

Exec provides a builder API for Popen::create, and includes convenience methods for capturing the output, and for connecting subprocesses into pipelines.

§Examples

Execute an external command and wait for it to complete:

let exit_status = Exec::cmd("umount").arg(dirname).join()?;

Execute the command using the OS shell, like C’s system:

Exec::shell("shutdown -h now").join()?;

Start a subprocess and obtain its output as a Read trait object, like C’s popen:

let stream = Exec::cmd("ls").stream_stdout()?;
// call stream.read_to_string, construct io::BufReader(stream), etc.

Capture the output of a command:

let out = Exec::cmd("ls")
  .stdout(Redirection::Pipe)
  .capture()?
  .stdout_str();

Redirect errors to standard output, and capture both in a single stream:

let out_and_err = Exec::cmd("ls")
  .stdout(Redirection::Pipe)
  .stderr(Redirection::Merge)
  .capture()?
  .stdout_str();

Provide input to the command and read its output:

let out = Exec::cmd("sort")
  .stdin("b\nc\na\n")
  .stdout(Redirection::Pipe)
  .capture()?
  .stdout_str();
assert!(out == "a\nb\nc\n");

Implementations§

Source§

impl Exec

Source

pub fn cmd(command: impl AsRef<OsStr>) -> Exec

Constructs a new Exec, configured to run command.

The command will be run directly in the OS, without an intervening shell. To run it through a shell, use Exec::shell instead.

By default, the command will be run without arguments, and none of the standard streams will be modified.

Source

pub fn shell(cmdstr: impl AsRef<OsStr>) -> Exec

Constructs a new Exec, configured to run cmdstr with the system shell.

subprocess never spawns shells without an explicit request. This command requests the shell to be used; on Unix-like systems, this is equivalent to Exec::cmd("sh").arg("-c").arg(cmdstr). On Windows, it runs Exec::cmd("cmd.exe").arg("/c").

shell is useful for porting code that uses the C system function, which also spawns a shell.

When invoking this function, be careful not to interpolate arguments into the string run by the shell, such as Exec::shell(format!("sort {}", filename)). Such code is prone to errors and, if filename comes from an untrusted source, to shell injection attacks. Instead, use Exec::cmd("sort").arg(filename).

Source

pub fn arg(self, arg: impl AsRef<OsStr>) -> Exec

Appends arg to argument list.

Source

pub fn args(self, args: &[impl AsRef<OsStr>]) -> Exec

Extends the argument list with args.

Source

pub fn detached(self) -> Exec

Specifies that the process is initially detached.

A detached process means that we will not wait for the process to finish when the object that owns it goes out of scope.

Source

pub fn env_clear(self) -> Exec

Clears the environment of the subprocess.

When this is invoked, the subprocess will not inherit the environment of this process.

Source

pub fn env(self, key: impl AsRef<OsStr>, value: impl AsRef<OsStr>) -> Exec

Sets an environment variable in the child process.

If the same variable is set more than once, the last value is used.

Other environment variables are by default inherited from the current process. If this is undesirable, call env_clear first.

Source

pub fn env_extend(self, vars: &[(impl AsRef<OsStr>, impl AsRef<OsStr>)]) -> Exec

Sets multiple environment variables in the child process.

The keys and values of the variables are specified by the slice. If the same variable is set more than once, the last value is used.

Other environment variables are by default inherited from the current process. If this is undesirable, call env_clear first.

Source

pub fn env_remove(self, key: impl AsRef<OsStr>) -> Exec

Removes an environment variable from the child process.

Other environment variables are inherited by default.

Source

pub fn cwd(self, dir: impl AsRef<Path>) -> Exec

Specifies the current working directory of the child process.

If unspecified, the current working directory is inherited from the parent.

Source

pub fn stdin(self, stdin: impl Into<InputRedirection>) -> Exec

Specifies how to set up the standard input of the child process.

Argument can be:

  • a Redirection;
  • a File, which is a shorthand for Redirection::File(file);
  • a Vec<u8> or &str, which will set up a Redirection::Pipe for stdin, making sure that capture feeds that data into the standard input of the subprocess;
  • NullFile, which will redirect the standard input to read from /dev/null.
Source

pub fn stdout(self, stdout: impl Into<OutputRedirection>) -> Exec

Specifies how to set up the standard output of the child process.

Argument can be:

  • a Redirection;
  • a File, which is a shorthand for Redirection::File(file);
  • NullFile, which will redirect the standard output to go to /dev/null.
Source

pub fn stderr(self, stderr: impl Into<OutputRedirection>) -> Exec

Specifies how to set up the standard error of the child process.

Argument can be:

  • a Redirection;
  • a File, which is a shorthand for Redirection::File(file);
  • NullFile, which will redirect the standard error to go to /dev/null.
Source

pub fn popen(self) -> PopenResult<Popen>

Starts the process, returning a Popen for the running process.

Source

pub fn join(self) -> PopenResult<ExitStatus>

Starts the process, waits for it to finish, and returns the exit status.

This method will wait for as long as necessary for the process to finish. If a timeout is needed, use <...>.detached().popen()?.wait_timeout(...) instead.

Source

pub fn stream_stdout(self) -> PopenResult<impl Read>

Starts the process and returns a value implementing the Read trait that reads from the standard output of the child process.

This will automatically set up stdout(Redirection::Pipe), so it is not necessary to do that beforehand.

When the trait object is dropped, it will wait for the process to finish. If this is undesirable, use detached().

Source

pub fn stream_stderr(self) -> PopenResult<impl Read>

Starts the process and returns a value implementing the Read trait that reads from the standard error of the child process.

This will automatically set up stderr(Redirection::Pipe), so it is not necessary to do that beforehand.

When the trait object is dropped, it will wait for the process to finish. If this is undesirable, use detached().

Source

pub fn stream_stdin(self) -> PopenResult<impl Write>

Starts the process and returns a value implementing the Write trait that writes to the standard input of the child process.

This will automatically set up stdin(Redirection::Pipe), so it is not necessary to do that beforehand.

When the trait object is dropped, it will wait for the process to finish. If this is undesirable, use detached().

Source

pub fn communicate(self) -> PopenResult<Communicator>

Starts the process and returns a Communicator handle.

This is a lower-level API that offers more choice in how communication is performed, such as read size limit and timeout, equivalent to Popen::communicate.

Unlike capture(), this method doesn’t wait for the process to finish, effectively detaching it.

Source

pub fn capture(self) -> PopenResult<CaptureData>

Starts the process, collects its output, and waits for it to finish.

The return value provides the standard output and standard error as bytes or optionally strings, as well as the exit status.

Unlike Popen::communicate, this method actually waits for the process to finish, rather than simply waiting for its standard streams to close. If this is undesirable, use detached().

Source

pub fn to_cmdline_lossy(&self) -> String

Show Exec as command-line string quoted in the Unix style.

Trait Implementations§

Source§

impl BitOr<Exec> for Pipeline

Source§

fn bitor(self, rhs: Exec) -> Pipeline

Append a command to the pipeline and return a new pipeline.

Source§

type Output = Pipeline

The resulting type after applying the | operator.
Source§

impl BitOr for Exec

Source§

fn bitor(self, rhs: Exec) -> Pipeline

Create a Pipeline from self and rhs.

Source§

type Output = Pipeline

The resulting type after applying the | operator.
Source§

impl Clone for Exec

Source§

fn clone(&self) -> Exec

Returns a copy of the value.

This method is guaranteed not to fail as long as none of the Redirection values contain a Redirection::File variant. If a redirection to File is present, cloning that field will use File::try_clone method, which duplicates a file descriptor and can (but is not likely to) fail. In that scenario, Exec::clone panics.

1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Exec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl Freeze for Exec

§

impl RefUnwindSafe for Exec

§

impl !Send for Exec

§

impl !Sync for Exec

§

impl Unpin for Exec

§

impl UnwindSafe for Exec

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.