导航到无法再使用空格的目录

Dor*_*ori 2 unix bash macos

我是 bash 的新手,因为我一直在 Windows 机器上开发(是的,我知道)。直到最近我才能够通过使用 cd 进入一个目录

cd a\ dir\ name\ with\ spaces/
Run Code Online (Sandbox Code Playgroud)

但突然这不再起作用了。即使使用 TAB 自动完成,它也会生成正确的转义符,但我总是遇到类似的问题

-bash: cd: a: No such file or directory
Run Code Online (Sandbox Code Playgroud)

一位朋友提到它可能与路径有关。任何人都可以为我解释这个问题吗?


下面是我的 .bash_profile

# Exe subshell script
source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

.bashrc

function cs ()
{
  cd $1
  ls
}

# A new version of "cd" which
# prints the directory after cd'ing
cd() {
        builtin cd $1
        pwd
}
Run Code Online (Sandbox Code Playgroud)

slh*_*hck 5

正确的替换是:

cd() {
    builtin cd "$1"
    pwd
}
Run Code Online (Sandbox Code Playgroud)

如果要保留空格,则需要在扩展时引用包含空格的变量。


为什么我需要这样做?

让我们检查一下:

  • 假设您cd使用参数调用自定义函数with\ spaces
  • 显然,您需要这样做,否则,您的函数将获得两个参数,即withspaces
  • 因此,正确转义,您的函数将with spaces作为一个参数。
  • 您将此参数传递给builtin cdusing $1
  • $1自动扩展为with spaces(因为这是函数接收到的)。
  • 你现在的电话是 builtin cd with spaces/
  • 这再次导致cd使用两个参数withand调用 to spaces

所以要修复它:

  • 报价$1双引号
  • 该命令扩展为builtin cd "with spaces".
  • 现在再次cd使用一个参数正确调用。

另一种可能性是只使用更通用的"$@"而不是"$1"所有参数传递给另一个脚本,而不仅仅是第一个。在 99% 的情况下,这都是您想要做的。

cd() {
    builtin cd "$@"
    pwd
}
Run Code Online (Sandbox Code Playgroud)

显然,同样的修复适用于您的cs()功能。