From cd63b5ffd756fd23e2385b935254dcceabe82696 Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Sat, 7 Mar 2026 11:57:46 +0100 Subject: proper cd --- src/run/builtin.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'src/run/builtin.rs') diff --git a/src/run/builtin.rs b/src/run/builtin.rs index ed1285a..90c44a9 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -17,7 +17,7 @@ impl Builtin for cd { se: Arc>, args: &[BString], _stdin: &mut dyn Read, - _stdout: &mut dyn Write, + stdout: &mut dyn Write, ) -> Result { let mut dir = match current_dir() { Ok(path) => path.as_os_str().as_bytes().to_vec(), @@ -26,21 +26,31 @@ impl Builtin for cd { std::mem::swap(&mut dir, &mut se.lock().unwrap().prev_path); - match args.get(0).map(|v| &v[..]) { + let target_path: BString = match args.get(0).map(|v| &v[..]) { Some(b"-") => { - let _ = set_current_dir(OsStr::from_bytes(&dir)); + dir } Some(path) => { - let _ = set_current_dir(OsStr::from_bytes(path)); + path.to_vec() } None => { if let Some(home) = std::env::var_os("HOME") { - let _ = set_current_dir(home); + home.into_encoded_bytes() + } else { + writeln!(stdout, "$HOME not set")?; + return Err(Error::Exit(-1)); } } - } + }; - Ok(()) + if let Err(_) = set_current_dir(OsStr::from_bytes(&target_path)) { + write!(stdout, "failed to cd into ")?; + stdout.write_all(&target_path)?; + writeln!(stdout, "\n")?; + Err(Error::Exit(1)) + } else { + Ok(()) + } } } -- cgit v1.2.3