[英]MacOS bash script not honoring double quotes
我有一个构建脚本,我试图在其中将文件复制到带有空格的目录中。 当该行如此编写时,我的代码工作正常:
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
怎么了?
在脚本开头添加set -x
帮助我了解正在发生的事情并确定问题。
问题是应用程序包名称中有空格(例如“我的程序”),并且将路径括在单引号或双引号中不起作用 -因为我使用的文本编辑器将双引号更改为智能引号。
同样有效的是用反斜杠转义空格,如下所示:
好的:
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”
解释原因:因为 shell 只将常规 ASCII 引号视为引号字符,所以这被解释为五个参数,而不是预期的四个:
cp -f myfile '“My' 'Program.app/Contents/Resources”'
# ^^ ^^ ^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# | | | | |
# 1 2 3 4 5
...并且由于当最后一个是目录时cp
仅接受两个以上的非选项位置参数,但Program.app/Contents/Resources”
不是实际存在的目录,因此会引发使用错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.