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


95

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

档案名称: cdcode

文件内容:

cd ~/My Code

现在,这不是一个长路径名,但我的实际路径名是五个目录深,其中四个目录在路径中有空格。

顺便说一句,我已经试过cd "~/My Code"cd "~/My\ Code"和这些都不奏效。


1
我遇到与上述问题类似的问题。即,没有一种可能的方法可以更改到其中有空格的目录。什么都没有:cd“ My Passport” cd My \ Passport cd My“ Passport”无效。完美的作品。我可以列出:ls -l My \ Passport /正常工作。\> uname -a Linux主机2.6.18-8.1.8.el5.centos.plus#1 SMP Mon Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash版本3.1 .17(1)-发行-(i686-redhat-linux-gnu)有什么想法吗?
Denis C 2010年

Answers:


81

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

cd ~/"My Code"
cd ~/'My Code'

这里没有引用波浪号,因此波浪线扩展仍将运行。

cd "$HOME/My Code"

您可以在双引号字符串内扩展环境变量。这基本上就是波浪号扩展所做的

cd ~/My\ Code

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


3
您甚至可以CD〜/ My''Code,但是当您可以使用反斜杠转义它时,这将是很愚蠢的
Nick Dixon 2010年

41

我在此页面上找到以下解决方案:

x="test\ me"  
eval cd $x

组合 \在一个双引号的文本常量和eval之前cd它像一个魅力的工作使!


更清晰:用于CD脚本文件的目录:DIR = $(dirname“ $ 0”); 评估CD $ DIR
Michael Scott Cuthbert

1
这确实对我在OS X机器上运行bash脚本很有帮助。🎉–
timbillstrom

这里确实没有必要eval
本杰明W.

2
在OS X上,如果没有,我将无法获得其他/先前的答案eval
D. Woods


10

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

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

您不能使用:

cd ~"/My Code"

第一个有效的原因是外壳程序将〜/扩展为$ HOME /,然后在My Code上加上了双引号。第二个失败,因为没有映射到的用户称为“ "”(双引号)~"


9

在遇到相同问题后,我尝试了两种有效的解决方案:

1. ""在变量中使用双引号()。

最简单的方法是按照前面的答案中的双引号将变量引起来:

cd "$yourPathWithBlankSpace"

2.使用eval

根据这个Unix命令的答案来转义空格,您可以删除空格然后使用eval,如下所示:

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

4

一个反斜杠对我有用:

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中运行脚本,尽管大多数人只是为此使用别名。空格可能是红色鲱鱼。


谢谢Ry4an(和其他答复者)。看来我执行脚本不正确。我只是想像这样运行它:%./cdsomedir我没有意识到我需要使用“。”。像您一样运行脚本:%。cdsomedir.sh一旦这样做,它就会起作用。新手错误。谢谢!


2

在Linux下工作时,以下语法正确:

cd ~/My\ Code

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

$ . cdcode

(仅是“。”而不是“ ./”)


出于好奇,为什么这很重要?我只看过使用'./'。
whaley 2010年

./将产生一个新的shell,然后更改目录。因此,当脚本退出时,它返回到生成新shell的shell ...您将位于执行脚本的目录中,而不是〜/ My Code。'。' 另一方面导致脚本在外壳的当前实例中执行。
Alterlife 2010年

点“。” 是UNIX命令,是“源”命令的别名。它后面应跟一个文件名。因此,“ source myfile”将在您当前的shell中运行该文件。和“ .myfile”将执行相同的操作。“ ./”变量表示“当前目录”,不是命令。
JPGConnolly 2015年

2

使用双引号

go () 
{ 
    cd "$*"
}

谢谢。.bashrc文件中功能的有用补充,用于在将包含空格的目录名称粘贴到命令行时更改目录,而不必随后转义空格或引用整个内容。cds是一个更好的名字。
mattst,2016年

有什么方法可以扩展它(没有if),go使其等同于cd,即cd到主目录吗?
zennehoy

2

执行此操作的非常简单的方法是-

 $ cd My\ Folder

在bash中,运行DIR命令,在结果中,您将看到这样的结果中已经写入了文件夹或路径名,它们之间有空格-

$dir
My\ Folder
New\ Folder

2

这样可以做到:

cd ~/My\ Code

我不得不使用它来处理存储在iCloud Drive中的文件。您将不希望使用双引号(“),因为它必须是绝对路径。换句话说,您不能将双引号与波浪号(〜)组合在一起。

举例来说,我不得不在最近的项目中使用它:

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

希望对您有所帮助。


1

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

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

茂或可能没有用。


0

使用单引号,例如:

myPath=~/'my dir'

cd $myPath
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.