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