繁体   English   中英

MacOS bash 脚本不支持双引号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM