bash - 如何 cd 进入名称中有空格的目录?

标签 bash cygwin cd

我正在尝试进入目录/cygdrive/c/Users/my dir/Documents:

$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

$ echo $DOCS
/cygdrive/c/Users/my\ dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my\: No such file or directory

$ cd /cygdrive/c/Users/my\ dir/Documents
(success)

当我手动输入时,退格键会执行其转义字符操作,但当我对变量 DOCS 使用参数扩展时则不会。

我尝试了其他变体,例如没有反斜杠。

$ DOCS=/cygdrive/c/Users\ dir/Documents

$ echo $DOCS
/cygdrive/c/Users/my dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory

$ DOCS="/cygdrive/c/Users/my dir/Documents"

$ echo $DOCS
/cygdrive/c/Users/my dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory

$HOME 也是如此:

$ echo $HOME
/home/my dir

cd $HOME 也不起作用。必须在其周围加上引号。

到底是什么:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""

$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"

$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory

最佳答案

$ cd "$DOCS"

您需要引用 "$DOCS" 以防止空格被解析为单词分隔符。通常情况下,应该引用变量引用。

注意 $HOME 也会有同样的问题。问题出在 shell 评估变量引用时;这与您使用什么变量或如何分配给它们无关。这是需要引用的扩展。

$ echo $HOME
/home/my dir

这是骗人的。 echo 实际上是回显两个字符串/home/mydir。如果您使用 cdls,您将看到它的实际工作方式。

$ ls $HOME
ls: cannot access /home/my: No such file or directory
ls: cannot access dir: No such file or directory
$ cd $HOME
bash: cd: /home/my: No such file or directory
$ cd "$HOME"
<success!>

Can I ask why it works when I manually type it in but not in a variable?

好问题!让我们检查一下您键入的命令:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""
$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"
$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory

这不起作用的原因是 Bash 不解析变量扩展中的引号。它确实执行单词拆分,因此未加引号的变量扩展中的空格被用作单词分隔符。它不会以任何方式解析引号,这意味着您不能将双引号放在变量中以覆盖分词。

$ cd $DOCS

因此,cd 被传递了两个参数。据 cd 所知,它看起来像你写的:

$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'

两个参数,双引号完整。

关于bash - 如何 cd 进入名称中有空格的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323508/

相关文章:

cygwin - 将 cygwin bash 转换为 tcsh

c++ - 为 C/C++ 设置 Windows 构建环境的最佳方法

bash - 使用 awk 删除前导零给出八进制结果

linux - 删除文件名中的前 4 个字母和后 4 个字母

linux - 为什么cygwin这么慢

bash - 进入目录后执行bash函数

docker - 在 Docker 中更改目录命令?

bash - Dockerfile 更改用户访问失败

bash - Git hooks 跨平台的条件 shebang