我正在尝试进入目录/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/my
和dir
。如果您使用 cd
或 ls
,您将看到它的实际工作方式。
$ 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/