Как сделать Mac OS X .app с помощью сценария оболочки?

Я пробовал следовать нескольким учебникам, но я получаю это:Ошибка PowerPC

Как я могу это исправить? Я добавил в info.plist (я просто скопировал и вставил файл другого приложения и кое-что изменил).

Кроме того, я chmod +x myAppделал скрипт исполняемым.

PS Я использую Эль-Капитан

Мы не можем догадаться, что вы сделали, прежде чем получить сообщение об ошибке. Каким учебникам вы следовали, после какого шага вы застряли?
Я создал папку с именем myApp.app, затем подпапку с именем Contents, затем MacOS, затем сценарий оболочки myApp, который содержит #!/bin/bash ; say "Hi" ; exit 0(с каждой из команд в разных строках и без точки с запятой).
Сценарий bash, в котором установлен бит выполнения, не обязательно помещать в пакет для выполнения, просто дважды щелкните его, если он находится только в Finder, или запустите его из терминала. Если вам действительно нужен пакет приложений, создайте его с помощью AppleScript или Automator, последний из которых прост. Добавьте действие Run Shell Script и поместите в него свой код.
@user3439894 user3439894 Я попробовал автоматизировать метод, который вы описали, прежде чем опубликовать это, но приложение не запустилось на целевом компьютере.
@user3439894 user3439894 Ну, почему-то я не могу отредактировать свой предыдущий комментарий. Ошибка была что-то вроде «Этот тип приложения не поддерживается на этом компьютере».
Является ли целевой компьютер тем, на котором было создано приложение Automator, и если нет, то почему вы не можете просто создать его на целевом компьютере? Почему это должен быть пакет приложения, почему скрипт не может быть просто выполнен, как указано в первом предложении моего первого комментария?
@ user3439894 У меня нет доступа к целевому компьютеру, так как это мои друзья. Кроме того, мне нужно, чтобы он открывался при запуске.
Какая версия OS X установлена ​​на целевом компьютере?
@user3439894 user3439894 Yosemite или El Capitan... не уверен, что именно.

Ответы (4)

Что ж, уже много лет я использую этот простой трюк, чтобы иметь сценарии bash в приложении (и действительно не понимаю, почему все люди пробуют такие сложные решения, как создание папок «Содержание», info.plist или использование Automator или Platypus или что-то в этом роде. .???).

  1. Создайте папку с именем «YourApplication.app». Его можно создать в любом удобном для вас месте. Тем не менее, наиболее совместимыми с ОС местами могут быть /Applications или ваша собственная папка ~/Applications.
  2. Поместите файл сценария прямо в эту папку так, как вам удобно (Finder, терминал и т. д.). Конечно, скрипт должен быть исполняемым (используйте chmod +x, если вам нужно). Нет необходимости в других папках или файлах (до тех пор, пока вам, конечно, не понадобится вызывать другие сценарии или исполняемый файл из вашего сценария). Хитрость заключается в том, чтобы назвать ваш сценарий точно таким же именем, как у папки приложения, но без расширения. В описанном здесь случае файл сценария должен называться «YourApplication».

Вот и все ! Он работает на Mac OS X, начиная со Snow Leopard и заканчивая Mavericks. Если кто может попробовать на более новых версиях ОС и подскажите.

Примечание . Скрипт должен иметь размер не менее 28 байт, иначе он не будет выполнен. Он может быть дополнен пустыми строками для достижения минимального размера. Кроме того, первая строка скрипта должна быть шебангом; например #!/bin/bashили #!/bin/perl.

[ОБНОВИТЬ]

Отвечая на вопрос, к чему относится комментарий @DenisHowe, при использовании этого трюка, если вы хотите иметь путь к текущему выполнению, вы можете добавить эти строки в начало скрипта:

abspath () 
{ 
case "${1}" in 
    [./]*)
    local ABSPATH="$(cd ${1%/*}; pwd)/"
    echo "${ABSPATH/\/\///}"
    ;;
    *)
    echo "${PWD}/"
    ;;
esac
}


CURRENTPATH=`abspath ${0}`
PATH=$PATH:$CURRENTPATH
Попробуйте добавить еще несколько строк, это даст вам сообщение, если в вашем скрипте недостаточно строк.
Я отредактировал ваш ответ, включив в него критически недостающую информацию, и проголосовал за него.
Хорошо, спасибо за исправление и голосование ... Я использую это слишком долго и забыл о необходимости 28 байтов ... У меня, конечно, нет такого маленького скрипта: D
Я только что проверил это в macOS Sierra, и там тоже все работает.
Ладно, круто. Ваше здоровье
Ух ты! Это работает! Не могу поверить. Большое спасибо. Изменить: протестировано на macOS Sierra
Ну, я не мог поверить, что никто раньше не пробовал это настолько простое решение... Я рад, что оно сработало для вас.
Для тех, кто пытается это сделать, убедитесь, что первая строка#!/bin/bash
@FlareCat На самом деле, я только что проверил, и я думаю, подойдет любой шебанг с существующим интерпретатором (пробовал с perl). Если вы пробовали другие языки, просто скажите ;).
Кто-нибудь знает, как заставить скрипт изменить рабочий каталог на папку .app?
@bugloaf Нашел свой ответ: stackoverflow.com/a/246128/214070
Чтобы присвоить ему собственный значок, выполните «Информация», выберите значок в левом верхнем углу, затем вставьте изображение размером 512x512.
@bugloaf: большую часть времени я использую этот трюк со сценариями, чтобы как бы «инкапсулировать» другие приложения в процесс (например, монтировать диски, управлять устройствами, агентами, демонами или выполнять синхронизацию перед запуском приложения), поэтому я просто использую подстановочное приложение значок, перетащив значок из исходного приложения панели «Получить информацию» нижний большой значок в целевое приложение панель «Получить информацию» вверх левый маленький значок (знак плюс должен появиться, когда мышь находится над маленьким значком, и поэтому вы можете вставить в этот момент).
Для тех, кто использует macOS Mojave, для этого можно использовать встроенную программу Automator. Просто используйте действие Run Shell Script, а затем сохраните как приложение
Что делать, если sudoтребуется запустить скрипт? Что можно сделать, чтобы скрипт запрашивал у пользователя пароль?
@Royi Ну, это во многом зависит от цели и команды, которую вам нужно запустить от имени пользователя root. Вы можете вызвать приложение (открыть -a ...), которое управляет эскалацией администратора, или вы можете использовать файл /etc/sudoers и добавить необходимые права для приложения/команды для вызывающего абонента/пользователя (в большинстве случаев ваш идентификатор Mac OS /пользователь). Остерегайтесь проблем с безопасностью, нарушение прав sudo не всегда является хорошим способом сделать что-то. Найдите «mac os sudoers» через Google, вы, вероятно, найдете много примеров (некоторые из них также есть в файле).
@Steve Vermeulen: это действительно еще одно решение, хотя оно уже было предложено в других ответах и ​​не относится к Мохаве. Это старая функция Mac Os Automator. Хотя это не так просто и элегантно, на мой взгляд. Это требуется только в том случае, если вам нужно передать параметры в определенных обстоятельствах (например, я думаю о действиях экспорта Lightroom).
Я бы указал, что это YourApplication.appдолжно быть cerated в/Applications
@Igor Fobia, я не знаю, какую версию ОС вы используете, но этот трюк работает из любого места, а не только из /Applications, по крайней мере, на Mac Os High Sierra и предыдущих версиях.
Работает и под macOS Catalina, спасибо
Похоже, это все еще работает с Big Sur. Передача аргументов (например, файл для открытия) у меня не работает. Кажется, это работает только с приложениями Automator.
@basbebe Спасибо за ваш отчет. На данный момент у меня нет Big Sur, чтобы искать решение по поводу аргументов (два моих Mac слишком старые). Но я постараюсь, как только смогу. Я предполагаю, что просмотр документации «open» с --args может дать еще несколько подсказок.
открытие с --argsработает. но, например, открытие документа с созданным приложением дает ошибку в окне терминала: Unknown command: \Xca\Xfe\Xba\Xbe(я также получаю эту ошибку, если просто добавляю местоположение файла к команде)
@basbebe, действительно, но я не уверен, что это относится конкретно к Биг Суру. Честно говоря, я не использую этот трюк со скриптовым приложением, если мне нужна функция «перетаскивания документа», вместо этого я использую Automator (иногда с комбинацией).
Мне нравится, как добавление ваших скриптов заставляет их мгновенно выполняться при нажатии и делает их более заметными в Spotlight.
При запуске в качестве приложения ваш сценарий, вероятно, не будет иметь ту же среду, что и при запуске из интерактивной оболочки. Например, вам может потребоваться установить PATH или указать абсолютные пути команд.
@DenisHowe Действительно. Вот пример того, что я обычно добавляю в начало скриптов: abspath () { case "${1}" in [./]*) local ABSPATH="$(cd ${1%/*}; pwd )/" echo "${ABSPATH/\/\///}" ;; *) эхо "${PWD}/" ;; esac } ТЕКУЩИЙ ПУТЬ= abspath ${0}ПУТЬ=$ПУТЬ:$ТЕКУЩИЙПУТЬ:
Можно ли показать терминал и запросить ввод с помощью этого решения? Мне удалось запустить скрипт в папке *.app, но я хочу распечатать некоторые значения и ввести некоторые данные с клавиатуры.
@user62013 user62013 В этот момент я использую Cocoadialog для того, что можно установить с помощью macports (боюсь, это пока не очень хорошо задокументировано, так как это довольно мертвый проект, но он все еще работает). Вы также можете использовать applescript для простых диалоговых окон и ввода. С другой стороны, на мой взгляд, не очень интересно использовать решение, которое я дал здесь (я имею в виду скрипт в простом приложении), чтобы в конце концов использовать терминал. Я думаю, вам лучше запустить скрипт напрямую с терминала, дважды щелкнув по нему, а затем использовать его стандартным способом.
Создание приложения таким образом не позволило мне создать файл pkg, для этого требуется более сложная структура?
@ ngood97 Можете ли вы уточнить, что вы подразумеваете под «создать файл pkg» (процесс, используемое программное обеспечение, цель)?
@PierreLagarde, да, конечно! Процесс, который я пытался выполнить, находится здесь: techrepublic.com/article/… -> sudo pkgbuild –install-location /Applications –component /Volumes/Google\ Chrome/Google\ Chrome.app ./Desktop/Google\ Chrome.pkg По какой-то причине инструменту pkgbuild не нравится эта структура, и он выдает следующую ошибку: pkgbuild: error: Path “<path x>/TestApplication.app" is not a valid bundle component (using destination path “<path x>”)Это не слишком важно, я просто хотел бы иметь минимальный pkg для тестирования.
На самом деле я смог сделать минимальный pkg с помощью этого руководства: matthew-brett.github.io/docosx/flat_packages.html , если кто-то ищет это .
@ngood97 хорошо, хорошо, и спасибо за ваш отзыв. Я должен сказать, что использовал этот трюк только эгоистично на своих собственных маках. Поскольку легко перенести текст bash на любой другой Mac, а приложение можно легко собрать в процессе самостоятельной сборки, я никогда не задаюсь вопросом, как сделать пакет для доставки. Это интересное дополнение, безусловно.
Как сделать так, чтобы он отображался в доке?
@TSR Перетащите его в Dock, как и любое другое приложение.

Принятый в настоящее время ответ не совсем работает для меня. Я получаю маленькую сломанную иконку приложения.

введите описание изображения здесь

Следующее работает для меня под OSX 10.15.7 (Catalina). Вы можете свободно менять YourApplicationво всех следующих инструкциях имя, которое вам действительно нужно.

  1. mkdir каталог с .appрасширением в /Applicationsпапке с Contentsа затем MacOSподкаталоги.

    mkdir -p /Applications/YourApplication.app/Contents/MacOS
    
  2. Переместите свой скрипт в этот каталог и назовите его так же, как верхнюю папку приложения, но без .appрасширения и без расширения сценария оболочки:

    mv yourscript.sh /Applications/YourApplication.app/Contents/MacOS/YourApplication
    
  3. Убедитесь, что ваш скрипт является исполняемым:

    chmod +x /Applications/YourApplication.app/Contents/MacOS/YourApplication
    

Вот пример приложения, чтобы попробовать:

#!/bin/sh
result=`osascript -e 'display dialog "Should I beep?" buttons {"Yes", "No"}'`
if [[ "$result" = "button returned:Yes" ]]; then
    osascript -e 'beep'
fi

Теперь ваше приложение должно быть готово, и скрипт должен запускаться при двойном щелчке по нему. Важно отметить, что если вы переименуете приложение, вам нужно будет переименовать базовый скрипт.


Было сложнее понять, что ваше приложение может увидеть LaunchPad. Следующее, похоже, сработало. Вам нужно добавить что-то вроде следующего в /Applications/YourApplication.app/Contents/Info.plistфайл. Вам также может потребоваться переместить его в файл DMG и обратно в Applications for LaunchPad, чтобы заметить его. См.: https://stackoverflow.com/a/71342335/179850 .

<?xml version="1.0" encoding="UTF-8" standalone="no"?><plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>My App</string>
    <key>CFBundleGetInfoString</key>
    <string>My App 1.0</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
</dict>
</plist>

Чтобы добавить значок в ваше новое приложение, вам необходимо сделать следующее:

  1. Найдите или создайте PNG, который вы хотите использовать в качестве значка.

  2. Откройте изображение в приложении Preview — другие графические приложения также могут работать.

  3. Нажмите command-a, чтобы выбрать все, а затем command-c, чтобы скопировать его в буфер обмена.

  4. Выберите свое приложение в Finder и нажмите command-i, чтобы открыть окно «Информация».

  5. Нажмите на значок в верхнем левом углу информационного окна, чтобы выбрать его:

    введите описание изображения здесь

  6. Вставьте изображение из буфера обмена, которое должно изменить значок.

    введите описание изображения здесь

Вы также можете открыть окно «Информация» в другом приложении, выбрать его значок и скопировать его, чтобы вставить в новое приложение. После того, как вы назначите любой значок, если вы посмотрите в свой .appкаталог, вы должны увидеть имя файла, начинающееся с Icon.

Вам не нужно иметь все эти папки в одном приложении. Просто поместите свой скрипт прямо в корневую папку приложения (например, /Applications/YourApplication.app в вашем случае) и сделайте его исполняемым. Он просто должен быть размером не менее 28 байт и иметь шебанг, как и любой скрипт.
Все это очень хорошо, и все работает так, как описано, но ничего из этого не делает его видимым для Launcher, что является основной причиной, по которой я хочу в первую очередь превратить свой скрипт в «приложение». Кто-нибудь может поставить этот последний бит?
Что такое пусковая установка @q.undertow? Вы имеете в виду Launchpad? Может быть, инструкции отсюда о перетаскивании вашего нового приложения на значок LaunchPad? appletoolbox.com/…
Да, Launchpad, извините. Я попробую эту ссылку, но я не хочу возиться с областью system/Applications — мой скрипт находится в ~/Applications. У меня было несколько загруженных приложений, и я помню, что у Launchpad не было проблем с этим.
Я добавил несколько дополнительных инструкций @q.undertow. Мое приложение теперь отображается в Launchpad. Посмотрите, работает ли это для вас.
@all Извините за поздний ответ, но я не был уведомлен о ваших вопросах, так как они были в другой теме. Вы можете просто добавить файл info.plist прямо в папку YourApplication.app. Нет необходимости в подпапках, как уже было сказано для скрипта. Таким образом, оно будет отображаться в списке Launchpad как любое другое приложение. Я все еще использую это в Монтерее. Я могу помочь, если у вас что-то пойдет не так, просто отметьте меня здесь :D. Единственным ограничением является передача аргументов. Вместо этого вам нужно будет создать приложение Automator.

Если это простой сценарий оболочки, вам не нужно оборачивать его в пакет приложения; вы можете дважды щелкнуть сам сценарий. Однако у вас не будет возможности иметь собственный значок или другие подобные вещи.

Я думаю, что есть несколько помощников, которые могут оборачивать простые скрипты, но единственный, с которым у меня есть опыт, это Platypus , который позволяет вам запускать скрипты shell/python/perl/ruby/etc как обычные приложения с иконками, я/ O перенаправления и т.д.

Отличие Platypus в том, что вы МОЖЕТЕ получить STDIN/STDOUT с помощью нескольких различных механизмов, а также через интерактивность строки меню. Таким образом, вы получаете окно, в котором вы можете взаимодействовать с любым запущенным скриптом.

Platypus, по-видимому, нельзя использовать из командной строки (вероятнее всего, там, где находится ваш сценарий оболочки).

Этот скрипт https://github.com/andrewp-as-is/mac-appify , который можно установить с помощью pip для пользователей python ( pip install mac-appify), похоже, выполняет шаги , описанные в ответе выше .

Это может быть полезно так

pip install mac-appify
appify script.sh  /Applications/$NAME.app