diff --git a/crates/nu-command/src/filesystem/cd.rs b/crates/nu-command/src/filesystem/cd.rs index 2ad57b505c..2ad032db81 100644 --- a/crates/nu-command/src/filesystem/cd.rs +++ b/crates/nu-command/src/filesystem/cd.rs @@ -61,7 +61,13 @@ impl Command for Cd { Some(v) => { let path = v.as_path()?; let path = match nu_path::canonicalize_with(path, &cwd) { - Ok(p) => p, + Ok(p) => { + if !p.is_dir() { + return Err(ShellError::NotADirectory(v.span()?)); + } + p + } + Err(e) => { return Err(ShellError::DirectoryNotFoundHelp( v.span()?, diff --git a/crates/nu-protocol/src/shell_error.rs b/crates/nu-protocol/src/shell_error.rs index af163fa0ae..c3b46becb5 100644 --- a/crates/nu-protocol/src/shell_error.rs +++ b/crates/nu-protocol/src/shell_error.rs @@ -185,6 +185,10 @@ pub enum ShellError { #[diagnostic(code(nu::shell::io_error), url(docsrs), help("{0}"))] IOError(String), + #[error("Cannot change to directory")] + #[diagnostic(code(nu::shell::cannot_cd_to_directory), url(docsrs))] + NotADirectory(#[label("is not a directory")] Span), + #[error("Directory not found")] #[diagnostic(code(nu::shell::directory_not_found), url(docsrs))] DirectoryNotFound(#[label("directory not found")] Span),