我尝试了很多东西.见下文:
尝试进入目录:/ 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)
Run Code Online (Sandbox Code Playgroud)
非常奇怪的行为.当我手动输入时,退格会执行其转义字符.但是当我使用变量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
Run Code Online (Sandbox Code Playgroud)
要么
$ 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
Run Code Online (Sandbox Code Playgroud)
我知道这是可能的.看这里:
$ echo $HOME
/home/my dir
Run Code Online (Sandbox Code Playgroud)
[编辑]正如所指出的,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
Run Code Online (Sandbox Code Playgroud)
Joh*_*ica 43
$ cd "$DOCS"
Run Code Online (Sandbox Code Playgroud)
您需要引用"$DOCS"
以防止将空格解析为单词分隔符.通常,应引用变量引用.
请注意,$HOME
会有同样的问题.问题来自于shell评估变量引用时; 它与您使用的变量或分配方式无关.这是需要引用的扩展.
$ echo $HOME
/home/my dir
Run Code Online (Sandbox Code Playgroud)
这具有欺骗性.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!>
Run Code Online (Sandbox Code Playgroud)
当我手动输入而不是变量时,我可以问为什么它可以工作吗?
好问题!我们来看看你输入的命令:
$ 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
Run Code Online (Sandbox Code Playgroud)
这不起作用的原因是因为Bash不解析变量扩展中的引号.它确实执行了单词拆分,因此未加引号的变量扩展中的空格被视为单词分隔符.它不会以任何方式解析引号,这意味着您不能在变量中放置双引号来覆盖单词拆分.
$ cd $DOCS
Run Code Online (Sandbox Code Playgroud)
因此,cd
传递了两个参数.据我cd
所知,你写道:
$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'
Run Code Online (Sandbox Code Playgroud)
两个参数,双引号完整.
Min*_*eam 11
解:
cd "Documents and Photos"
Run Code Online (Sandbox Code Playgroud)
问题解决了.
我提交这个答案的原因是你会发现每天用户(不仅仅是网络开发人员,程序员或高级用户)都在使用StackOverflow,这是Google上一个简单的Windows用户问题的头号结果.
人们越来越懂技术,但在上述案例中并不一定熟悉命令行.
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"
Run Code Online (Sandbox Code Playgroud)
这是你的第一个问题.这会将实际的反斜杠字符放入$DOCS
,如您通过运行此命令所看到的:
$ echo "$DOCS"
/cygdrive/c/Users/my\ `
Run Code Online (Sandbox Code Playgroud)
定义时DOCS
,您需要转义空格字符.您可以引用字符串(使用单引号或双引号),也可以使用反斜杠转义空格字符.你不能两者都做.(在大多数类Unix系统上,你可以在文件或目录名中加一个反斜杠,虽然这不是一个好主意.在Cygwin或Windows上,\
是一个目录分隔符.但我会假设目录的实际名称是my dir
,不是my\ dir
.)
$ cd $DOCS
Run Code Online (Sandbox Code Playgroud)
这传递了两个参数cd
.第一个是cygdrive/c/Users/my\
,第二个是dir/Documents
.它发生了cd
悄然忽略除了第一个参数之外的所有参数,这解释了错误信息:
-bash: cd: /cygdrive/c/Users/my\: No such file or directory
Run Code Online (Sandbox Code Playgroud)
要设置目录$DOCS
的名称,请Documents
执行以下任一操作:
$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ DOCS='/cygdrive/c/Users/my dir/Documents'
$ DOCS=/cygdrive/c/Users/my\ dir/Documents
Run Code Online (Sandbox Code Playgroud)
完成后,要更改为您的Documents
目录,请将变量引用括在双引号中(对于bash中的任何变量引用都是个好主意,除非您确定该值没有任何有趣的字符):
$ cd "$DOCS"
Run Code Online (Sandbox Code Playgroud)
您可能还会考虑为该目录提供一个没有任何空格的名称 - 尽管在Windows上通常很难做到这一点.
归档时间: |
|
查看次数: |
72336 次 |
最近记录: |