我在 macOS X 上使用 Bash,我想创建一个简单的可执行脚本文件,该文件在运行时会更改为另一个目录。但是,该目录的路径中有空格。你到底是怎么做到的?这就是我所拥有的...
文件名:cdcode
文件内容:
cd ~/My Code
现在授予,这不是一个长路径名,但我的实际路径名是五个目录深,其中四个目录在路径中有空格。
顺便说一句,我已经尝试过cd "~/My Code"
,cd "~/My\ Code"
但这些都不起作用。
当您双引号路径时,您将停止波浪号扩展。所以有几种方法可以做到这一点:
cd ~/"My Code"
cd ~/'My Code'
这里没有引用波浪号,所以波浪号扩展仍然会运行。
cd "$HOME/My Code"
您可以在双引号字符串中扩展环境变量;这基本上就是波浪号扩展正在做的事情
cd ~/My\ Code
您还可以使用反斜杠转义特殊字符(例如空格)。
在解决了同样的问题之后,我尝试了两种不同的解决方案:
""
在变量中使用双引号 ( )。最简单的方法只是双引号你的变量在前面的答案中指出:
cd "$yourPathWithBlankSpace"
eval
.根据this answer Unix command to escape spaces你可以去掉空格然后使用eval
,像这样:
yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
cd ~/My\ Code
似乎对我有用...如果删除引号但保留斜杠不起作用,您可以发布一些示例代码吗?
您可以使用以下任何一种:
cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"
您不能使用:
cd ~"/My Code"
第一个有效,因为 shell 将 ~/ 扩展为 $HOME/,然后在没有双引号的情况下添加 My Code。第二个失败,因为没有一个名为 ' "
' (双引号)的用户~"
可以映射到。
这将做到:
cd ~/My\ Code
我不得不使用它来处理存储在 iCloud Drive 中的文件。您不想使用双引号 ("),因为它必须是绝对路径。换句话说,您不能将双引号与波浪号 (~) 结合使用。
例如,我不得不将它用于最近的一个项目:
cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project
我希望这会有所帮助。
一个反斜杠对我有用:
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 中运行脚本,尽管大多数人会为此使用别名。这些空间可能是一条红鲱鱼。
避免在脚本中使用 ~;改用 $HOME 。
在 Linux 下工作时,下面的语法是正确的:
cd ~/My\ Code
但是,当您执行文件时,请使用以下语法:
$ . cdcode
(只是 '.' 而不是 './')
使用双引号
go ()
{
cd "$*"
}
这样做的非常简单的方法是 -
$ cd My\ Folder
在 bash 中,运行 DIR 命令,在结果中您会看到在它们之间有空格的文件夹或路径名称已写入结果中,如下所示 -
$dir
My\ Folder
New\ Folder
使用单引号,例如:
myPath=~/'my dir'
cd $myPath
I had a similar problem now were I was using a bash script to dump some data. I ended up creating a symbolic link in the script folder with out any spaces in it. I then pointed my script to the symbolic link and that works fine.
To create your link. ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]
Mau or may not be of use.
我阅读了所有这些内容,但它们似乎不适用于 macOS Monterey。然后我将标题从更改#!/bin/sh
为#!/bin/zsh
,这似乎起到了作用。