我对 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
。 - 显然,你需要这样做,否则你的函数就会二参数,即
with
和spaces
。 - 因此,正确转义后,您的函数将
with spaces
变为一争论。 - 您将此参数传递给
builtin cd
使用$1
。 $1
自动扩展为with spaces
(因为这是函数接收的)。- 您现在拨打的电话是
builtin cd with spaces/
- 这又会导致
cd
调用二參數with
和spaces
。
因此要修复它:
- 引用
$1
双引号。 - 该命令扩展为
builtin cd "with spaces"
。 - 现在
cd
可以正确调用一再次争论。
另一种可能性是使用更通用的"$@"
而不是"$1"
传递全部参数,而不仅仅是第一个参数。在 99% 的情况下,您都希望这样做。
cd() {
builtin cd "$@"
pwd
}
显然,同样的修复也适用于您的cs()
功能。