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