【问题标题】:MacOS bash script not honoring double quotesMacOS bash 脚本不支持双引号
【发布时间】:2020-06-25 14:24:05
【问题描述】:

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

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

怎么了?

【问题讨论】:

  • shell脚本故障排除第一步:将set -x添加到脚本顶部以显示命令运行。
  • 好的,我快接近了...在添加“set -x”之后,我发现问题是我的应用名称中有空格,并且用双引号将整个内容括起来'在脚本中不起作用(但在终端中直接键入时起作用)。我现在正在尝试一些不同的东西......
  • 您的引号实际上是(如您的问题)还是实际上是"(如bash 期望引号)?
  • @MisterMiyagi,默认情况下,许多原生 MacOS 文本编辑器会自动将常规引号替换为智能引号,除非 the relevant "feature" is explicitly turned off。因此,对于使用非专业程序员编辑器的文本编辑器的人来说,在该平台上使用“智能引号”而不是纯 ASCII 引号并不是特别不寻常。
  • @CharlesDuffy 我在问,因为代码/终端中的引号通常是正确的,但是将它们写入答案会将它们变成智能引号。

标签: bash macos scripting


【解决方案1】:

在脚本开头添加set -x 有助于我了解发生了什么并确定问题。

问题是应用程序包名称中有空格(例如“我的程序”),并且用单引号或双引号将路径括起来不起作用 - 因为我使用的文本编辑器更改了双引号引号转换为智能引号

同样有效的是用反斜杠转义空格,如下所示:


好:

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

GOOD(但要小心;一些 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” 不是实际存在的目录,因此会引发使用错误。

【讨论】:

  • "MacOS 中的某些文本编辑器会自动将 ASCII 引号替换为智能引号,而这些绝对不会起作用。– Charles Duffy" BINGO。就是这样。
  • @RobC - 我相应地更新了我的答案,解释说只有当编辑器将引号更改为智能引号时它才是“坏的”。我认为如果其他人像我一样使用通用文本编辑器应用程序来编辑一个小的 bash 文件,可能会发生类似的事情。换句话说,这并不是真正的拼写错误,而是可能会再次发生在其他人身上的情况。我的问题已经解决了,不会再发生了,但我会说它可能会发生在其他人身上。也许可以修改帖子的标题以反映真正的问题。有什么建议吗?
  • 嗯。我们遇到了具有相同根本原因的其他问题——另一个是stackoverflow.com/questions/46426691/…——但现在我不确定这个问题是否有一个很好的规范实例。
  • 顺便说一句,在Ask Different,他们有一个问答条目,其中包含有关禁用智能引号的说明:apple.stackexchange.com/questions/136402/…
  • this questionAsk Different 中的前两个屏幕截图显示了可以在两个 “文本编辑” 首选项中禁用“智能引号”的位置和系统级键盘首选项。
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 2010-12-31
  • 2017-11-30
  • 2020-04-06
  • 1970-01-01
  • 2022-10-17
  • 2021-11-11
  • 2016-01-22
相关资源
最近更新 更多