不再能够导航到带有空格的目录

不再能够导航到带有空格的目录

我对 Bash 还很陌生,因为一直在 Windows 机器上开发(是的,我知道)。直到最近,我才能够使用 cd 进入目录

cd a\ dir\ name\ with\ spaces/

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

-bash: cd: a: No such file or directory

一位朋友提到这可能与路径有关。有人能帮我解释一下这个问题吗?


以下是我的.bash_profile

# Exe subshell script
source ~/.bashrc

还有.bashrc

function cs ()
{
  cd $1
  ls
}

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

答案1

正确的替换是:

cd() {
    builtin cd "$1"
    pwd
}

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


我为什么需要这样做?

让我们检查一下:

  • 假设您使用cd参数调用自定义函数with\ spaces
  • 显然,你需要这样做,否则你的函数就会参数,即withspaces
  • 因此,正确转义后,您的函数将with spaces变为争论。
  • 您将此参数传递给builtin cd使用$1
  • $1自动扩展为with spaces(因为这是函数接收的)。
  • 您现在拨打的电话是builtin cd with spaces/
  • 这又会导致cd调用參數withspaces

因此要修复它:

  • 引用$1双引号
  • 该命令扩展为builtin cd "with spaces"
  • 现在cd可以正确调用再次争论。

另一种可能性是使用更通用的"$@"而不是"$1"传递全部参数,而不仅仅是第一个参数。在 99% 的情况下,您都希望这样做。

cd() {
    builtin cd "$@"
    pwd
}

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

相关内容