From b549880687f6c9f70a9abbbebf75a068122ce666 Mon Sep 17 00:00:00 2001 From: pagedmov Date: Tue, 24 Feb 2026 15:15:30 -0500 Subject: [PATCH] subshells now fork a new process --- src/parse/execute.rs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/parse/execute.rs b/src/parse/execute.rs index 42cc76e..552a50e 100644 --- a/src/parse/execute.rs +++ b/src/parse/execute.rs @@ -305,18 +305,27 @@ impl Dispatcher { unreachable!() }; - let env_vars = self.set_assignments(assignments, AssignBehavior::Export)?; - let _var_guard = VarCtxGuard::new(env_vars.into_iter().collect()); - self.io_stack.append_to_frame(subsh.redirs); - let mut argv = prepare_argv(argv)?; + self.run_fork("anonymous_subshell", |s| { + if let Err(e) = s.set_assignments(assignments, AssignBehavior::Export) { + eprintln!("{e}"); + return; + }; + s.io_stack.append_to_frame(subsh.redirs); + let mut argv = match prepare_argv(argv) { + Ok(argv) => argv, + Err(e) => { + eprintln!("{e}"); + return; + } + }; - let subsh = argv.remove(0); - let subsh_body = subsh.0.to_string(); - let _guard = ScopeGuard::shared_scope(); + let subsh = argv.remove(0); + let subsh_body = subsh.0.to_string(); - exec_input(subsh_body, None, self.interactive)?; - - Ok(()) + if let Err(e) = exec_input(subsh_body, None, s.interactive) { + eprintln!("{e}"); + }; + }) } fn exec_func(&mut self, func: Node) -> ShResult<()> { let blame = func.get_span().clone();