diff --git a/src/builtin/cd.rs b/src/builtin/cd.rs index 6c8c6a1..bdddf5b 100644 --- a/src/builtin/cd.rs +++ b/src/builtin/cd.rs @@ -42,8 +42,16 @@ pub fn cd(node: Node, job: &mut JobBldr) -> ShResult<()> { )); } - env::set_current_dir(new_dir).unwrap(); - let new_dir = env::current_dir().unwrap(); + if let Err(e) = env::set_current_dir(new_dir) { + return Err(ShErr::full( + ShErrKind::ExecFail, + format!("cd: Failed to change directory: {}", e), + span, + )); + } + let new_dir = env::current_dir().map_err( + |e| ShErr::full(ShErrKind::ExecFail, format!("cd: Failed to get current directory: {}", e), span) + )?; unsafe { env::set_var("PWD", new_dir) }; state::set_status(0); diff --git a/src/parse/execute.rs b/src/parse/execute.rs index b1195c7..c868e3a 100644 --- a/src/parse/execute.rs +++ b/src/parse/execute.rs @@ -319,7 +319,7 @@ impl Dispatcher { state::set_status(*code); Ok(()) } - _ => Err(e), + _ => Err(e).blame(blame), } } else { Ok(())