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

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

文件名: cdcode

档案内容:

cd ~/My Code

现在我承认,这不是一个很长的路径名,但是我的实际路径名是5个目录,其中4个目录在路径中有空格。

顺便说一下,我试过 cd "~/My Code"cd "~/My\ Code",但都没用。

190022 次浏览
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/,然后在 My Code 上添加不带双引号的内容。第二个失败是因为没有一个名为‘ "’(双引号)的用户供 ~"映射。

当你双引一条路径时,你就停止了波浪膨胀,所以有几种方法可以做到这一点:

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

The tilde is not quoted here, so tilde expansion will still be run.

cd "$HOME/My Code"

您可以在双引号字符串中展开环境变量; 这基本上就是波浪线展开所做的

cd ~/My\ Code

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

我现在有一个类似的问题,我正在使用 bash 脚本转储一些数据。最后,我在脚本文件夹中创建了一个符号链接,其中没有任何空格。然后,我将脚本指向符号链接,这样就可以很好地工作了。

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

不管有没有用。

我在 这一页上找到了下面的解决方案:

x="test\ me"
eval cd $x

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

使用双引号

go ()
{
cd "$*"
}

避免使用脚本中的 ~ ,而是使用 $HOME。

The very simple way of doing this is-

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder

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

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

最简单的方法就是双引号你的变量,就像前面的答案一样:

cd "$yourPathWithBlankSpace"

2. 充分利用 eval

According to this answer Unix command to escape spaces you can strip blank space then make use of eval, like this:

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

使用单引号,比如:

myPath=~/'my dir'


cd $myPath

这样就行了:

cd ~/My\ Code

我必须用它来处理存储在 iCloud Drive 中的文件。您不会希望使用双引号(“) ,因为它必须是绝对路径。换句话说,你不能把双引号和波浪号(~)结合起来。

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

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

I hope that helps.

我读了所有这些,它们似乎在 macOS 蒙特雷上不起作用。然后我把标题从 #!/bin/sh改为 #!/bin/zsh,看起来效果不错。