subshells now fork a new process
This commit is contained in:
@@ -305,18 +305,27 @@ impl Dispatcher {
|
|||||||
unreachable!()
|
unreachable!()
|
||||||
};
|
};
|
||||||
|
|
||||||
let env_vars = self.set_assignments(assignments, AssignBehavior::Export)?;
|
self.run_fork("anonymous_subshell", |s| {
|
||||||
let _var_guard = VarCtxGuard::new(env_vars.into_iter().collect());
|
if let Err(e) = s.set_assignments(assignments, AssignBehavior::Export) {
|
||||||
self.io_stack.append_to_frame(subsh.redirs);
|
eprintln!("{e}");
|
||||||
let mut argv = prepare_argv(argv)?;
|
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 = argv.remove(0);
|
||||||
let subsh_body = subsh.0.to_string();
|
let subsh_body = subsh.0.to_string();
|
||||||
let _guard = ScopeGuard::shared_scope();
|
|
||||||
|
|
||||||
exec_input(subsh_body, None, self.interactive)?;
|
if let Err(e) = exec_input(subsh_body, None, s.interactive) {
|
||||||
|
eprintln!("{e}");
|
||||||
Ok(())
|
};
|
||||||
|
})
|
||||||
}
|
}
|
||||||
fn exec_func(&mut self, func: Node) -> ShResult<()> {
|
fn exec_func(&mut self, func: Node) -> ShResult<()> {
|
||||||
let blame = func.get_span().clone();
|
let blame = func.get_span().clone();
|
||||||
|
|||||||
Reference in New Issue
Block a user