diff --git a/src/shell/execute.rs b/src/shell/execute.rs index ce9754a..226dd55 100644 --- a/src/shell/execute.rs +++ b/src/shell/execute.rs @@ -589,12 +589,15 @@ async fn execute_subshell( ) .await; - // sub shells do not cause an exit match result { ExecuteResult::Exit(code, handles) => { + // sub shells do not cause an exit ExecuteResult::Continue(code, Vec::new(), handles) } - ExecuteResult::Continue(_, _, _) => result, + ExecuteResult::Continue(code, _env_changes, handles) => { + // env changes are not propagated + ExecuteResult::Continue(code, Vec::new(), handles) + }, } } diff --git a/src/shell/test.rs b/src/shell/test.rs index 6bd7b36..cc54547 100644 --- a/src/shell/test.rs +++ b/src/shell/test.rs @@ -672,6 +672,40 @@ async fn pwd() { .await; } +#[tokio::test] +async fn subshells() { + TestBuilder::new() + .command("(export TEST=1) && echo $TEST") + .assert_stdout("\n") + .assert_exit_code(0) + .run() + .await; + TestBuilder::new() + .directory("sub_dir") + .command("echo $PWD && (cd sub_dir && echo $PWD) && echo $PWD") + .assert_stdout(&format!("$TEMP_DIR\n$TEMP_DIR{FOLDER_SEPERATOR}sub_dir\n$TEMP_DIR\n")) + .assert_exit_code(0) + .run() + .await; + TestBuilder::new() + .command("export TEST=1 && (echo $TEST && unset TEST && echo $TEST) && echo $TEST") + .assert_stdout("1\n\n1\n") + .assert_exit_code(0) + .run() + .await; + TestBuilder::new() + .command("(exit 1) && echo 1") + .assert_exit_code(1) + .run() + .await; + TestBuilder::new() + .command("(exit 1) || echo 1") + .assert_stdout("1\n") + .assert_exit_code(0) + .run() + .await; +} + #[tokio::test] #[cfg(unix)] async fn pwd_logical() {