MacOS bash脚本不支持双引号
我有一个构建脚本,在这个脚本中,我试图将一个文件复制到一个带有空格的目录中。我的代码在这样编写代码行时运行良好:MacOS bash脚本不支持双引号,bash,macos,scripting,Bash,Macos,Scripting,我有一个构建脚本,在这个脚本中,我试图将一个文件复制到一个带有空格的目录中。我的代码在这样编写代码行时运行良好: cp test.png My\ Program.app/Contents/Resources 但是当它被写为: cp test.png “My Program.app/Contents/Resources” …它失败并出现错误: 用法:cp[-R[-H |-L |-P][-fi |-n][-apvXc]源文件目标文件 cp[-R[-H |-L |-P][-fi |-n][-apv
cp test.png My\ Program.app/Contents/Resources
但是当它被写为:
cp test.png “My Program.app/Contents/Resources”
…它失败并出现错误:
用法:cp[-R[-H |-L |-P][-fi |-n][-apvXc]源文件目标文件
cp[-R[-H |-L |-P][-fi |-n][-apvXc]源文件。。。目标目录
有什么问题吗?在脚本开头添加
set-x
,帮助我了解发生了什么,并确定了问题所在
问题是应用程序包名称(例如“我的程序”)中有空格,用单引号或双引号括起路径不起作用——因为我使用的文本编辑器将双引号改为智能引号
同样有效的方法是用反斜杠逃出空格,如下所示:
好:
好(但要小心;某些MacOS文本编辑器可能会自动将其更改为稍后的坏表单):
错误(由于引号是“智能引号”,而不是普通ASCII引号): 解释原因:由于shell仅将常规ASCII引号视为引号字符,因此会将其解释为五个参数,而不是预期的四个参数:
cp -f myfile '“My' 'Program.app/Contents/Resources”'
# ^^ ^^ ^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# | | | | |
# 1 2 3 4 5
…而且由于
cp
仅接受两个以上的非选项位置参数,而最后一个参数是目录,但Program.app/Contents/Resources“
不是实际存在的目录,它抛出了一个使用错误。shell脚本故障排除的第一步:将set-x
添加到脚本顶部,以显示命令运行。好的,我马上就要。。。在添加了“set-x”之后,我发现问题在于我的应用程序名中有空格,用双引号将整个内容括起来在脚本中是不起作用的(但直接在终端中键入时它会起作用)。我现在正在尝试一些不同的事情…你的引号是真的“
(如你的问题)还是真的”
(如bash所期望的那样)?@MisterMiyagi,许多本机MacOS文本编辑器默认情况下会自动将常规引号替换为智能引号,除非使用“智能引号”“因此,对于那些使用非专业程序员编辑器的文本编辑器的人来说,在该平台上使用普通ASCII引号并不是特别不寻常的事情。@CharlesDuffy我这样问是因为引号在代码/终端中通常是正确的,但将其写入答案会将其转换为智能引号。”。“MacOS中的一些文本编辑器会自动将ASCII引号替换为智能引号,这些肯定不会起作用。”–Charles Duffy“答对了。就是这样。@RobC-我相应地更新了我的答案,解释说它“不好”"只有当编辑器将引号更改为智能引号时,我认为如果其他人像我一样使用通用文本编辑器应用程序编辑一个小的bash文件,这种情况可能会发生在他们身上。换句话说,这不是一个真正的打字错误,这是一种可能会再次发生在其他人身上的情况。我的问题已经解决,不会再次发生,但我认为这可能会发生在o身上另外。也许这篇文章的标题可以修改,以反映真正的问题。建议?嗯。我们也有其他问题,有相同的根本原因——另一个是——但现在我不确定是否有一个很好的规范性问题。顺便说一句,在,他们有一个Q&a条目,其中有关于禁用智能引号的说明:在Ask Different show的前两个屏幕截图中,可以在“文本编辑”首选项和系统级键盘首选项中禁用“智能报价”。
cp -f myfile "My Program.app/Contents/Resources"
cp -f myfile “My Program.app/Contents/Resources”
cp -f myfile '“My' 'Program.app/Contents/Resources”'
# ^^ ^^ ^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# | | | | |
# 1 2 3 4 5