我有一个构建脚本,该文件试图将文件复制到带有空格的目录中。行写成这样时,我的代码工作正常:
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
怎么了?
答案 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”
不是实际存在的目录,因此会引发使用错误