Запустить приложение на OS X с командной строкой

Я хочу запустить приложение на OSX из скрипта. Мне нужно передать это аргументы командной строки. К сожалению, open не принимает аргументы командной строки.

Единственный вариант, о котором я могу подумать, - это использовать nohup myApp >/dev/null & для запуска моего приложения, чтобы оно могло существовать независимо от запускающего его скрипта.

Есть лучшие предложения?

Ответ 1

В OS X 10.6 команда open была улучшена, чтобы позволить передачу аргументов приложению:

open ./AppName.app --args -AppCommandLineArg

Но для более старых версий Mac OS X, а также потому, что пакеты приложений не предназначены для передачи аргументов командной строки, обычным механизмом является использование Apple Events для файлов, таких как здесь, для приложений Cocoa или здесь, для приложений Carbon. Вы также можете, вероятно, сделать что-то полезное, передав параметры в переменные окружения.

Ответ 2

Как было упомянуто в вопросе здесь, то open команда в 10.6 теперь имеет args флаг, так что вы можете позвонить:

open -n./AppName.app --args -AppCommandLineArg

Ответ 3

Пакет приложения (файл .app) на самом деле представляет собой набор каталогов. Вместо использования open и имени .app вы можете перейти к нему и запустить реальный двоичный файл. Например:

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

Это фактический двоичный файл, который может принимать аргументы (или нет, в случае LittleSnapper).

Ответ 4

Если ваше приложение должно работать с файлами (то, что вы обычно ожидаете передать как: ./myApp *.jpg), вы должны сделать это так:

open *.jpg -a myApp

Ответ 5

Я бы рекомендовал технику, которую предлагает MathieuK. В моем случае мне нужно было попробовать с Chromium:

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

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

Ответ 6

Начиная с OS X Yosemite, теперь мы можем использовать AppleScript и Automator для автоматизации сложных задач. JavaScript для автоматизации теперь можно использовать как язык сценариев.

На этой странице представлен хороший пример сценария, который можно написать в командной строке с использованием интерактивного режима bash и osascript. Он открывает вкладку Safari и переходит на example.com.

http://developer.telerik.com/featured/javascript-os-x-automation-example/
osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.push(tab); 
window.currentTab = tab;

Ответ 7

open также имеет флаг -a, который можно использовать для открытия приложения из папки "Приложения" по его имени (или идентификатором пакета с флагом -b). Вы можете комбинировать это с параметром --args для достижения желаемого результата:

open -a APP_NAME --args ARGS

Чтобы открыть видео в проигрывателе VLC, которое должно масштабироваться с коэффициентом 2x и циклом, вы бы, например, произнесли:

open -a VLC --args -L --fullscreen

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

Ответ 8

С applescript:

tell application "Firefox" to activate

Ответ 9

Я хотел запустить два отдельных экземпляра Chrome, каждый из которых использовал свой профиль. Я хотел иметь возможность запускать их из Spotlight, как и моя привычка запускать приложения для Mac. Другими словами, мне нужно было два обычных приложения для Mac: regChrome для обычного просмотра и altChrome чтобы использовать специальный профиль, чтобы его можно было легко запустить, нажав ⌘ -space, чтобы вызвать Spotlight, затем "reg" или "alt", затем Enter.

Я полагаю, что грубым способом достижения вышеуказанной цели было бы сделать две копии пакета приложений Google Chrome под соответствующими именами. Но это некрасиво и усложняет обновление.

В итоге я получил два приложения AppleScript, содержащих по две команды в каждом. Вот тот, для altChrome:

do shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

Вторая строка запускает Chrome с альтернативным профилем (параметр --user-data-dir).

Первая строка - неудачная попытка дать двум приложениям разные значки. Изначально все работает нормально. Однако рано или поздно Chrome перечитывает свой файл значков и получает тот, который соответствует тому, какое из двух приложений было запущено последним, что приводит к двум запущенным приложениям с одинаковым значком. Но я не удосужился попытаться это исправить - я держу два браузера на разных рабочих столах, и навигация между ними не была проблемой.

Ответ 10

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

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

Псевдоним, это еще один вариант, который я попробовал.

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

С помощью экспорта PATH я могу вызвать все команды в приложении. Аргументы прошли хорошо для моего теста с MacVim. В то время как псевдоним, мне пришлось псевдоним каждой команды в корзине.

mvim README.txt
gvim Anotherfile.txt

Наслаждайтесь силой псевдонима и PATH. Тем не менее, вам необходимо отслеживать изменения при обновлении ОС.

Ответ 11

можно ли запускать и воспроизводить песни без нажатия кнопки "Я попробовал --play, но не работал" -a/Applications/itunes.app/Contents/MacOS/itunes/play

Ответ 12

Просто замените "APP" на название приложения, которое вы хотите запустить.

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

Спасибо мне позже.