Skip to content

Commit 75657d5

Browse files
committed
Add Command environment variable inheritance docs
The interaction between the environment variable methods can be confusing. Specifically `env_clear` and `remove_env` have a side effects not mentioned: they disable inheriting environment variables from the parent process. I wanted to fully document this behavior as well as explain relevant edge cases in each of the `Command` env methods. This is further confused by the return of `get_envs` which will return key/None if `remove_env` has been used, but an empty iterator if `env_clear` has been called. Or a non-empty iterator if `env_clear` was called and later explicit mappings are added. Currently there is no way (that I'm able to find) of observing whether or not the internal `env_clear=true` been toggled on the `Command` struct via its public API. Ultimately environment variable mappings can be in one of several states: - Explicitly set value (via `envs` / `env`) will take precedence over parent mapping - Not explicitly set, will inherit mapping from parent - Explicitly removed via `remove_env`, this single mapping will not inherit from parent - Implicitly removed via `env_clear`, no mappings will inherit from parent I tried to represent this in the relevant sections of the docs. This is my second ever doc PR (whoop!). I'm happy to take specific or general doc feedback. Also happy to explain the logic behind any changes or additions I made.
1 parent 511364e commit 75657d5

File tree

1 file changed

+61
-15
lines changed

1 file changed

+61
-15
lines changed

library/std/src/process.rs

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -644,10 +644,19 @@ impl Command {
644644
self
645645
}
646646

647-
/// Inserts or updates an environment variable mapping.
647+
/// Inserts or updates an explicit environment variable mapping.
648648
///
649-
/// Note that environment variable names are case-insensitive (but case-preserving) on Windows,
650-
/// and case-sensitive on all other platforms.
649+
/// This method allows you to add an environment variable mapping to the spawned process or
650+
/// overwrite a previously set value. You can use [`Command::envs`] to set multiple environment
651+
/// variables simultaneously.
652+
///
653+
/// Child processes will inherit environment variables from their parent process by default.
654+
/// Environment variables explicitly set using [`Command::env`] take precedence over inherited
655+
/// variables. You can disable environment variable inheritance entirely using
656+
/// [`Command::env_clear`] or for a single key using [`Command::env_remove`].
657+
///
658+
/// Note that environment variable names are case-insensitive (but
659+
/// case-preserving) on Windows and case-sensitive on all other platforms.
651660
///
652661
/// # Examples
653662
///
@@ -671,7 +680,19 @@ impl Command {
671680
self
672681
}
673682

674-
/// Adds or updates multiple environment variable mappings.
683+
/// Inserts or updates multiple explicit environment variable mappings.
684+
///
685+
/// This method allows you to add multiple environment variable mappings to the spawned process
686+
/// or overwrite previously set values. You can use [`Command::env`] to set a single environment
687+
/// variable.
688+
///
689+
/// Child processes will inherit environment variables from their parent process by default.
690+
/// Environment variables explicitly set using [`Command::envs`] take precedence over inherited
691+
/// variables. You can disable environment variable inheritance entirely using
692+
/// [`Command::env_clear`] or for a single key using [`Command::env_remove`].
693+
///
694+
/// Note that environment variable names are case-insensitive (but case-preserving) on Windows
695+
/// and case-sensitive on all other platforms.
675696
///
676697
/// # Examples
677698
///
@@ -708,7 +729,18 @@ impl Command {
708729
self
709730
}
710731

711-
/// Removes an environment variable mapping.
732+
/// Removes an explicitly set environment variable and prevents inheriting it from a parent
733+
/// process.
734+
///
735+
/// This method will remove the explicit value of an environment variable set via
736+
/// [`Command::env`] or [`Command::envs`]. In addition, it will prevent the spawned child
737+
/// process from inheriting that environment variable from its parent process.
738+
///
739+
/// After calling [`Command::env_remove`], the value associated with its key from
740+
/// [`Command::get_envs`] will be [`None`].
741+
///
742+
/// To clear all explicitly set environment variables and disable all environment variable
743+
/// inheritance, you can use [`Command::env_clear`].
712744
///
713745
/// # Examples
714746
///
@@ -728,7 +760,17 @@ impl Command {
728760
self
729761
}
730762

731-
/// Clears the entire environment map for the child process.
763+
/// Clears all explicitly set environment variables and prevents inheriting any parent process
764+
/// environment variables.
765+
///
766+
/// This method will remove all explicitly added environment variables set via [`Command::env`]
767+
/// or [`Command::envs`]. In addition, it will prevent the spawned child process from inheriting
768+
/// any environment variable from its parent process.
769+
///
770+
/// After calling [`Command::env_remove`], the iterator from [`Command::get_envs`] will be
771+
/// empty.
772+
///
773+
/// You can use [`Command::env_remove`] to clear a single mapping.
732774
///
733775
/// # Examples
734776
///
@@ -980,17 +1022,21 @@ impl Command {
9801022
CommandArgs { inner: self.inner.get_args() }
9811023
}
9821024

983-
/// Returns an iterator of the environment variables that will be set when
984-
/// the process is spawned.
1025+
/// Returns an iterator of the environment variables explicitly set for the child process.
1026+
///
1027+
/// Environment variables explicitly set using [`Command::env`], [`Command::envs`], and
1028+
/// [`Command::env_remove`] can be retrieved with this method.
1029+
///
1030+
/// Note that this output does not include environment variables inherited from the parent
1031+
/// process.
9851032
///
986-
/// Each element is a tuple `(&OsStr, Option<&OsStr>)`, where the first
987-
/// value is the key, and the second is the value, which is [`None`] if
988-
/// the environment variable is to be explicitly removed.
1033+
/// Each element is a tuple key/value pair `(&OsStr, Option<&OsStr>)`. A [`None`] value
1034+
/// indicates its key was explicitly removed via [`Command::env_clear`]. The associated key for
1035+
/// the [`None`] value will no longer inherit from its parent process.
9891036
///
990-
/// This only includes environment variables explicitly set with
991-
/// [`Command::env`], [`Command::envs`], and [`Command::env_remove`]. It
992-
/// does not include environment variables that will be inherited by the
993-
/// child process.
1037+
/// An empty iterator can indicate that no explicit mappings were added or that
1038+
/// [`Command::env_clear`] was called. After calling [`Command::env_clear`], the child process
1039+
/// will not inherit any environment variables from its parent process.
9941040
///
9951041
/// # Examples
9961042
///

0 commit comments

Comments
 (0)