使用bash脚本cd到pathname中包含空格的目录

时间:2009-02-26 04:50:42

标签: bash escaping

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

档案名称:cdcode

文件内容:

cd ~/My Code

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

顺便说一句,我已经尝试了cd "~/My Code"cd "~/My\ Code",但这些都没有奏效。

13 个答案:

答案 0 :(得分:75)

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

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

此处未引用波浪号,因此仍会运行波浪号扩展。

cd "$HOME/My Code"

您可以在双引号字符串中展开环境变量;这基本上就是代字号扩展所做的事情

cd ~/My\ Code

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

答案 1 :(得分:34)

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

x="test\ me"  
eval cd $x

双引号文本常量中的\eval之前的cd的组合使其像魅力一样工作!

答案 2 :(得分:8)

cd ~/My\ Code

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

答案 3 :(得分:8)

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

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

你不能使用:

cd ~"/My Code"

第一个可行,因为shell扩展〜/进入$ HOME /,然后在没有双引号的情况下在我的代码上添加。第二个失败是因为"没有一个名为“~"”(双引号)的用户要映射到。

答案 4 :(得分: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中运行脚本,尽管大多数人只会使用别名。这些空间可能是红鲱鱼。

答案 5 :(得分:3)

避免〜脚本;使用$ HOME代替。

答案 6 :(得分:3)

在努力解决同样的问题之后,我尝试了两种不同的解决方案:

1。对变量使用双引号("")。

最简单的方法是双引号变量,如前面的答案所示:

cd "$yourPathWithBlankSpace"

2。利用eval

根据此回答Unix command to escape spaces,您可以删除空格,然后使用eval,如下所示:

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

答案 7 :(得分:3)

这可以做到:

cd ~/My\ Code

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

通过示例,我不得不在最近的项目中使用它:

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

我希望能帮上忙。

答案 8 :(得分:2)

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

cd ~/My\ Code

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

$ . cdcode

(只是'。'而不是'./')

答案 9 :(得分:2)

使用双引号

go () 
{ 
    cd "$*"
}

答案 10 :(得分:2)

这样做的简单方法是 -

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder

答案 11 :(得分:1)

我现在遇到类似的问题,因为我正在使用bash脚本来转储一些数据。我最终在脚本文件夹中创建了一个符号链接,其中没有任何空格。然后我将我的脚本指向了符号链接,并且工作正常。

创建链接。 ln -s [TARGET DIRECTORY OR FILE] ./ [SHORTCUT]

Mau或可能没用。

答案 12 :(得分:0)

使用单引号,例如:

myPath=~/'my dir'

cd $myPath