diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-01-15 15:26:56 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-01-15 15:26:56 -0500 |
commit | 30e37c7f6e3e69fefc709b6be5bcfb3a647909fc (patch) | |
tree | b5f2b78cdb541b9ce1dbbedbf21707327e68975b /src/runner/builtins/mod.rs | |
parent | 3adc8b67354a492f4bceed4b9bf1ec5c000c2056 (diff) | |
download | nbsh-30e37c7f6e3e69fefc709b6be5bcfb3a647909fc.tar.gz nbsh-30e37c7f6e3e69fefc709b6be5bcfb3a647909fc.zip |
implement `cd -`
Diffstat (limited to 'src/runner/builtins/mod.rs')
-rw-r--r-- | src/runner/builtins/mod.rs | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/runner/builtins/mod.rs b/src/runner/builtins/mod.rs index ff03499..c345a85 100644 --- a/src/runner/builtins/mod.rs +++ b/src/runner/builtins/mod.rs @@ -65,7 +65,9 @@ fn cd( ) -> std::process::ExitStatus { let dir = if let Some(dir) = exe.args().get(0) { if dir.is_empty() { - ".".to_string() + ".".to_string().into() + } else if dir == "-" { + env.prev_pwd().await } else { dir.into() } @@ -74,11 +76,29 @@ fn cd( if dir.is_empty() { bail!(cfg, exe, "could not find home directory"); } - dir + dir.into() + }; + let prev = match std::env::current_dir() { + Ok(path) => path, + Err(e) => { + bail!( + cfg, + exe, + "could not find current directory: {}", + crate::format::io_error(&e) + ); + } }; if let Err(e) = std::env::set_current_dir(&dir) { - bail!(cfg, exe, "{}: {}", crate::format::io_error(&e), dir); + bail!( + cfg, + exe, + "{}: {}", + crate::format::io_error(&e), + dir.display() + ); } + env.set_prev_pwd(&prev).await; async_std::process::ExitStatus::from_raw(0) } |