我在 macOS X 上使用 Bash,我想创建一个简单的可执行脚本文件,它在运行时会更改到另一个目录。但是,该目录的路径中有空格。你到底是怎么做到的?这就是我所拥有的。
文件名: cdcode
cdcode
档案内容:
cd ~/My Code
现在我承认,这不是一个很长的路径名,但是我的实际路径名是5个目录,其中4个目录在路径中有空格。
顺便说一下,我试过 cd "~/My Code"和 cd "~/My\ Code",但都没用。
cd "~/My Code"
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 下工作时,下面的语法是正确的:
但是,在执行文件时,请使用以下语法:
$ . 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"
您可以在双引号字符串中展开环境变量; 这基本上就是波浪线展开所做的
还可以用反斜杠转义特殊字符(如空格)。
我现在有一个类似的问题,我正在使用 bash 脚本转储一些数据。最后,我在脚本文件夹中创建了一个符号链接,其中没有任何空格。然后,我将脚本指向符号链接,这样就可以很好地工作了。
创建链接。 Ln-s [目标目录或文件] ./[快捷方式]
不管有没有用。
我在 这一页上找到了下面的解决方案:
x="test\ me" eval cd $x
\在双引号文本常数和 cd之前的 eval的组合使它像一个魅力!
\
cd
eval
使用双引号
go () { cd "$*" }
避免使用脚本中的 ~ ,而是使用 $HOME。
The very simple way of doing this is-
$ cd My\ Folder
在 bash 中,运行 DIR 命令,在结果中,您会看到在它们之间有空格的文件夹或路径名称已经写入结果中,如下所示-
$dir My\ Folder New\ Folder
在与同一个问题作斗争之后,我尝试了两种不同的解决方案:
""
最简单的方法就是双引号你的变量,就像前面的答案一样:
cd "$yourPathWithBlankSpace"
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
这样就行了:
我必须用它来处理存储在 iCloud Drive 中的文件。您不会希望使用双引号(“) ,因为它必须是绝对路径。换句话说,你不能把双引号和波浪号(~)结合起来。
作为一个例子,我不得不在最近的一个项目中使用它:
cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project
I hope that helps.
我读了所有这些,它们似乎在 macOS 蒙特雷上不起作用。然后我把标题从 #!/bin/sh改为 #!/bin/zsh,看起来效果不错。
#!/bin/sh
#!/bin/zsh