summaryrefslogtreecommitdiffstats
path: root/src/runner/builtins/mod.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-01-15 15:26:56 -0500
committerJesse Luehrs <doy@tozt.net>2022-01-15 15:26:56 -0500
commit30e37c7f6e3e69fefc709b6be5bcfb3a647909fc (patch)
treeb5f2b78cdb541b9ce1dbbedbf21707327e68975b /src/runner/builtins/mod.rs
parent3adc8b67354a492f4bceed4b9bf1ec5c000c2056 (diff)
downloadnbsh-30e37c7f6e3e69fefc709b6be5bcfb3a647909fc.tar.gz
nbsh-30e37c7f6e3e69fefc709b6be5bcfb3a647909fc.zip
implement `cd -`
Diffstat (limited to 'src/runner/builtins/mod.rs')
-rw-r--r--src/runner/builtins/mod.rs26
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)
}