Скрипт MacOS bash не поддерживает двойные кавычки - PullRequest
1 голос
/ 13 марта 2020

У меня есть скрипт сборки, в котором я пытаюсь скопировать файл в каталог с пробелами. Мой код работает нормально, когда строка написана так:

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 Ответ

2 голосов
/ 13 марта 2020

Добавление set -x в начале скрипта помогло мне увидеть, что происходит, и выявить проблему.

Проблема заключалась в том, что в имени пакета приложения были пробелы (например, «Моя программа»), и заключив путь в одинарные или двойные кавычки не сработало - , потому что текстовый редактор, который я использовал, изменил двойные кавычки на умные кавычки .

То, что также работало, было экранирование пробелы с обратной косой чертой sh, например:


ХОРОШО:

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

ХОРОШО (но будьте осторожны; некоторые текстовые редакторы MacOS могут изменить это позднее BAD автоматически формируется):

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

BAD (поскольку кавычки являются «умными кавычками» вместо простых кавычек 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” не является каталогом, который действительно существует, он выдает ошибку использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...