68

我正在尝试进入目录/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
4

15 回答 15

68
$ cd "$DOCS"

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

注意$HOME会有同样的问题。问题出在外壳评估变量引用时;这与您使用的变量或分配给它们的方式无关。这是需要引用的扩展。

$ echo $HOME
/home/my dir

这是骗人的。echo实际上是在回显两个字符串/home/mydir. 如果你使用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!>

我可以问为什么当我手动输入它而不是变量时它会起作用吗?

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

$ 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"'

两个参数,双引号完整。

于 2013-08-19T21:38:44.443 回答
26

解决方案:

cd "Documents and Photos"

问题解决了。

我提交这个答案的原因是你会发现 StackOverflow 正在被每天的用户(不仅仅是网络开发人员、程序员或高级用户)使用,这是谷歌上一个简单的 Windows 用户问题的第一结果。

人们越来越精通技术,但在上述情况下不一定熟悉命令行。

于 2017-07-16T14:01:26.087 回答
5
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

这是你的第一个问题。这会将一个实际的反斜杠字符放入$DOCS,您可以通过运行以下命令看到:

$ echo "$DOCS"
/cygdrive/c/Users/my\ `

定义时DOCS,您确实需要转义空格字符。您可以引用字符串(使用单引号或双引号)也可以只使用反斜杠转义空格字符。你不能两者都做。(在大多数类 Unix 系统上,您可以在文件或目录名称中使用反斜杠,但这不是一个好主意。在 Cygwin 或 Windows 上,\是目录分隔符。但我将假设目录的实际名称是my dir,不是my\ dir。)

$ cd $DOCS

这将两个参数传递给cd. 第一个是cygdrive/c/Users/my\,第二个是dir/Documents。碰巧它cd悄悄地忽略了除第一个参数之外的所有参数,这解释了错误消息:

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

要设置$DOCS为您的Documents目录名称,请执行以下任一操作:

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

完成此操作后,要切换到您的目录,请将变量引用括在双引号中(这对于 bash 中的任何Documents变量引用都是一个好主意,除非您确定该值没有任何有趣的字符):

$ cd "$DOCS"

您也可以考虑为该目录命名,其中不包含任何空格——尽管在 Windows 上通常很难做到这一点。

于 2013-08-19T22:11:14.427 回答
4

要更改到名称上带有空格的目录,您只需键入如下:

cd My\ Documents

点击进入,你会很好

于 2019-10-31T14:29:46.610 回答
2

使用引号! cd "Name of Directory"
或者你可以去文件资源管理器点击左上角的“复制路径”!

于 2020-10-14T14:54:56.147 回答
1

为什么不将以下内容放入您的.cshrc(或.bashrc,或您的默认外壳)中:

alias mydoc 'cd "/cygdrive/c/Users/my dir/Documents"'

第一次这样做,你必须这样做

source .cshrc

用这个新别名更新 shell,然后你可以输入

mydoc

您可以随时cd访问您的目录。

懒惰是发明之母...

于 2013-08-19T21:54:54.310 回答
1

如果您想离开c:\并想去 ,请c:\Documents and settings在控制台上写:c:\Documents\[space]+tabcy​​gwin 将自动完成它c:\Documents\ and\ settings/

于 2015-09-30T15:34:22.607 回答
1

Cygwin 无法识别 PC 名称之间的空格。所以要解决这个问题,你必须在第一个单词后使用“\”,然后包含空格,然后是姓氏。

比如“.../my\dir/”

$ cd /cygdrive/c/Users/my\ dir/Documents

另一种有趣且简单的方法是将目录放在引号中(“”)

例如按如下方式运行它:

$ cd c:
$ cd Users
$ cd "my dir"
$ cd Documents

希望它有效吗?

于 2019-05-07T19:52:00.047 回答
0

尝试

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

cd "$DOCS"
于 2013-08-19T21:39:47.367 回答
0

使用反斜杠符号 ( \) 转义空格:

C:\> cd my folder

将会

 C:\> cd my\ folder 
于 2018-02-22T14:34:58.560 回答
0

方法1:带引号

cd "C:/Prgram Files (x86)"

cd 'C:/Program Files (x86)'

广义的

cd 'Folder Path'

方法2:不使用引号

cd Program\ Files \(x86\)

广义 每当我们想跳过下一个字符时,我们都会使用 blackslash \

对于上述问题: cd /cygdrive/c/Users/my\ dir/Documents

于 2018-06-04T07:50:35.717 回答
0

作为使用引号的替代方法,对于您想要经常访问的目录,您可以使用cdable_varsshell 选项

shopt -s cdable_vars
docs='/cygdrive/c/Users/my dir/Documents'

现在,要从任何地方切换到该目录,您可以使用

cd docs

并且外壳将指示它更改为哪个目录:

$ cd docs
/cygdrive/c/Users/my dir/Documents
于 2019-10-17T17:17:19.530 回答
0

这里讨论的方法不适用于一致的别名 - 添加/不添加引号等。

例如,如果我有一个类似的目录变量dir_with_spaces='path of the directory with spaces',则无法直接使用alias new_dir='cd $dir_with_spaces/subdirectory'.

作为替代方案,创建一个在 cd 周围添加引号的自定义函数会很有用,然后改用这个自定义函数。

cdwq() # Custom cd to support directories with spaces in the name by adding quotes around it
{
 local folder_path=$1
 cd "${folder_path}"
}

现在,可以将此自定义函数与任何目录变量一起使用。

dir_with_spaces='path of the directory with spaces'
dir_without_spaces='path_of_the_directory_without_spaces'

alias new_dir1='cdwq $dir_with_spaces/subdirectory1'
alias new_dir2='cdwq $dir_with_spaces/subdirectory2'
alias new_dir3='cdwq $dir_without_spaces/subdirectory3'
alias new_dir4='cdwq $dir_without_spaces/subdirectory4'
alias new_dir5='cdwq $dir_with_spaces/subdirectory5'
于 2021-08-18T19:35:43.813 回答
0

好的,我也花了一些令人沮丧的时间来解决这个问题。我的小向导。

例如打开桌面。如果您没有在 cmd 中切换光盘,请键入:

光盘桌面

现在,如果要显示子文件夹:

cd , 制作 1 个空格键, 然后按Tab 2 次

现在,如果您想使用SPACE IN NAME输入目录/文件。让我们打开一些文件名fg,打开它我们需要输入:

cd 文件\名称

ps 注意斜线后的这个空格:)

于 2016-06-25T14:36:43.973 回答
-2

代替:

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

尝试:

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

这应该适用于任何POSIX系统。

于 2013-08-19T21:37:43.500 回答