MacOS bash脚本不接受双引号

时间:2020-03-13 14:57:12

标签: bash macos scripting

我有一个构建脚本,该文件试图将文件复制到带有空格的目录中。行写成这样时,我的代码工作正常:

cp test.png My\ Program.app/Contents/Resources

但是写成:

cp test.png “My Program.app/Contents/Resources”

...失败并出现错误:

usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory

怎么了?

1 个答案:

答案 0 :(得分:2)

在脚本开头添加set -x可以帮助我了解正在发生的情况并确定问题所在。

问题是应用程序捆绑包名称中存在空格(例如“我的程序”),并且用单引号或双引号引起来的路径不起作用-因为我使用的文本编辑器已更改为double报价转为智能报价

可行的方法是用反斜杠转义空格,如下所示:


好:

cp -f myfile My\ Program.app/Contents/Resources

好的(但要小心;某些MacOS文本编辑器可能会自动将其更改为以后的BAD形式):

cp -f myfile "My Program.app/Contents/Resources"

不良(由于引号是“智能引号”,而不是纯ASCII引号):

cp -f myfile “My Program.app/Contents/Resources”

解释原因:由于外壳程序仅将常规ASCII引号视为引号字符,因此它将被解释为五个参数,而不是预期的四个:

  cp -f myfile '“My' 'Program.app/Contents/Resources”'
# ^^ ^^ ^^^^^^  ^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# |  |    |      |                  |
# 1  2    3      4                  5

...并且由于cp仅在最后一个目录是目录时接受两个以上的非选项位置参数,而Program.app/Contents/Resources”不是实际存在的目录,因此会引发使用错误