我尝试了很多事情.见下文:
尝试进入目录:
/ 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/Rahman\ 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
我知道这是可能的.看这里:
$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
这是欺骗性的回声实际上是回应两个字符串/ 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"'
两个参数,双引号完好无损.