Bash脚本到cd到路径名中带有空格的目录

Bash脚本到cd到路径名中带有空格的目录,bash,escaping,Bash,Escaping,我在macOS X上使用Bash,我想创建一个简单的可执行脚本文件,当它运行时,该文件将更改为另一个目录。但是,该目录的路径中有空格。你到底是怎么做到的?这就是我所拥有的 文件名:cdcode 文件内容: cd ~/My Code 现在,这不是一个很长的路径名,但我的实际路径名有五个目录深,其中四个目录的路径中有空格 顺便说一句,我试过cd“~/mycode”和cd“~/My\code”,但这两种方法都不起作用 cd ~/My\ Code 似乎对我有用。。。如果删除引号但保留斜杠不起作用,您

我在macOS X上使用Bash,我想创建一个简单的可执行脚本文件,当它运行时,该文件将更改为另一个目录。但是,该目录的路径中有空格。你到底是怎么做到的?这就是我所拥有的

文件名:
cdcode

文件内容:

cd ~/My Code
现在,这不是一个很长的路径名,但我的实际路径名有五个目录深,其中四个目录的路径中有空格

顺便说一句,我试过
cd“~/mycode”
cd“~/My\code”
,但这两种方法都不起作用

cd ~/My\ Code

似乎对我有用。。。如果删除引号但保留斜杠不起作用,您可以发布一些示例代码吗?

一个反斜杠对我很有效:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

您确定问题不是您的shell脚本正在更改其子shell中的目录,而是在完成后又回到了主shell(和原始目录)中吗?我用电脑避免了这一点。在当前shell中运行脚本,尽管大多数人只会使用别名。这些空格可能是一种误导。

在Linux下工作时,下面的语法是正确的:

cd~/My\code

但是,在执行文件时,请使用以下语法:

$。cdcode

(只有“.”而不是“/”)

您可以使用以下任何一种:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"
您不能使用:

cd ~"/My Code"

第一种方法有效,因为shell将~/扩展为$HOME/,然后在我的代码中添加双引号。第二个失败,因为没有一个名为“
”(双引号)的用户用于映射到
~“

当您双引号引用一个路径时,您正在停止波浪线扩展。因此,有几种方法可以做到这一点:

cd ~/"My Code"
cd ~/'My Code'
此处未引用tilde,因此仍将运行tilde扩展

cd "$HOME/My Code"
可以在双引号字符串中展开环境变量;这基本上就是tilde扩展所做的

cd ~/My\ Code

您还可以使用反斜杠转义特殊字符(如空格)。

我现在遇到了一个类似的问题,当时我正在使用bash脚本转储一些数据。我最终在脚本文件夹中创建了一个符号链接,其中没有任何空格。然后我把我的脚本指向符号链接,效果很好

创建链接。 ln-s[目标目录或文件]。/[快捷方式]


Mau或可能不起作用。

我在上找到了以下解决方案:

将双引号文本常量中的
\
cd
之前的
eval
组合在一起,使其像一个符咒一样工作

使用双引号

go () 
{ 
    cd "$*"
}

避免在脚本中使用~;改用$HOME。

最简单的方法是-

 $ cd My\ Folder
在bash中,运行DIR命令,在结果中,您会看到文件夹或路径名之间有空格,它们已写入结果中,如下所示-

$dir
My\ Folder
New\ Folder

在与同一问题斗争之后,我尝试了两种不同的解决方案:

1.对变量使用双引号(
“”
)。 最简单的方法是,如前一个答案所述,将变量双引号引起来:

cd "$yourPathWithBlankSpace"
2.使用
eval
。 根据此答案,您可以去掉空白,然后使用
eval
,如下所示:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

使用单引号,如:

myPath=~/'my dir'

cd $myPath
这可以做到:

cd ~/My\ Code
我不得不用它来处理存储在iCloud驱动器中的文件。您不希望使用双引号(“),因为它必须是绝对路径。换句话说,您不能将双引号与波浪号(~)组合

举个例子,我不得不在最近的一个项目中使用:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

我希望这能有所帮助。

谢谢,Ry4an(以及其他受访者)。似乎我执行的脚本不正确。我只是想这样运行:%./cdsomedir我没有意识到我需要使用”。“要像您那样运行脚本:%。一旦我这么做了,它就成功了。新手的错误。谢谢您甚至可以使用cd~/My“”代码,但如果您可以用反斜杠代替标题来逃避它,那就太傻了。我遇到了与前面描述的问题类似的问题。也就是说,没有一种可能的方法可以更改到一个有空格的目录。没有像:cd“我的护照”cd我的\护照cd我的“护照”这样的东西没有任何作用。这个装置运转良好。我可以列出:ls-l My\Passport/工作正常。\>uname-Linux主机2.6.18-8.1.8.el5.centos.plus#1 SMP周一至七月16日08:49:50 EDT 2007 i686 i686 i686 i386 GNU/Linux\>bash-帮助GNU bash,版本3.1.17(1)-发布-(i686 redhat Linux GNU)有什么想法吗?出于好奇,为什么这很重要?我只见过“/”useed../将生成一个新的shell,然后更改目录。所以当脚本退出时,它会返回到生成新shell的shell。。。您将位于执行脚本的目录中,而不是~/My Code另一方面,使脚本在shell的当前实例中执行。点“.”是unix命令,“源”命令的别名。它后面应该跟一个文件名。因此,“sourcemyfile”将在当前shell中运行该文件。和“.myfile”也会这样做。“/”变量表示“当前目录”,不是命令。更清楚的是:对于cd'ing到脚本文件的目录:DIR=$(dirname“$0”);eval cd$DIRThis对我在OSX机器上运行bash脚本真的很有帮助。这里真的不需要
eval
。在OS X上,没有
eval
,我无法获得其他/先前的答案。谢谢。这是对
.bashrc
文件中函数的有用补充,用于在将包含空格的目录名粘贴到命令行时更改目录,而无需转义空格或引用整个内容
cd
是一个更好的名称。有没有办法扩展这个名称(没有if),使
go
等同于
cd
,即cd到主目录?
cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project