Clear environment for child Commands (#12901)

# Description
There is a bug when `hide-env` is used on environment variables that
were present at shell startup. Namely, child processes still inherit the
hidden environment variable. This PR fixes #12900, fixes #11495, and
fixes #7937.

# Tests + Formatting
Added a test.
This commit is contained in:
Ian Manske 2024-05-19 15:35:07 +00:00 committed by GitHub
parent cc9f41e553
commit 474293bf1c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 0 deletions

View File

@ -530,6 +530,9 @@ impl ExternalCommand {
}
/// Spawn a command without shelling out to an external shell
///
/// Note that this function will not set the cwd or environment variables.
/// It only creates the command and adds arguments.
pub fn spawn_simple_command(&self, cwd: &str) -> Result<std::process::Command, ShellError> {
let (head, _, _) = trim_enclosing_quotes(&self.name.item);
let head = nu_path::expand_to_real_path(head)
@ -537,6 +540,7 @@ impl ExternalCommand {
.to_string();
let mut process = std::process::Command::new(head);
process.env_clear();
for (arg, arg_keep_raw) in self.args.iter().zip(self.arg_keep_raw.iter()) {
trim_expand_and_apply_arg(&mut process, arg, arg_keep_raw, cwd);

View File

@ -126,6 +126,15 @@ fn passes_with_env_env_var_to_external_process() {
assert_eq!(actual.out, "foo");
}
#[test]
fn hides_environment_from_child() {
let actual = nu!(r#"
$env.TEST = 1; ^$nu.current-exe -c "hide-env TEST; ^$nu.current-exe -c '$env.TEST'"
"#);
assert!(actual.out.is_empty());
assert!(actual.err.contains("cannot find column"));
}
#[test]
fn has_file_pwd() {
Playground::setup("has_file_pwd", |dirs, sandbox| {