Запустите приложение на OS X с командной строкой - PullRequest
100 голосов
/ 21 августа 2009

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

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

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

Ответы [ 11 ]

101 голосов
/ 18 октября 2009

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

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

68 голосов
/ 21 августа 2009

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

open ./AppName.app --args -AppCommandLineArg

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

32 голосов
/ 21 августа 2009

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

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

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

14 голосов
/ 23 февраля 2013

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

open *.jpg -a myApp
4 голосов
/ 24 сентября 2009

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

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

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

2 голосов
/ 17 сентября 2016

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

open -a APP_NAME --args ARGS

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

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

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

2 голосов
/ 21 марта 2016

Начиная с 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;
1 голос
/ 29 января 2014

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

Я полагаю, что грубым способом достижения вышеуказанной цели было бы сделать две копии пакета приложений 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 перечитывает свой файл значков и получает тот, который соответствует тому, какое из двух приложений было запущено последним, что приводит к двум запущенным приложениям с одинаковым значком. Но я не удосужился попытаться это исправить - я держу два браузера на разных рабочих столах, и навигация между ними не была проблемой.

1 голос
/ 10 ноября 2009

С яблочным шрифтом:

tell application "Firefox" to activate
0 голосов
/ 11 июня 2019

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

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

Спасибо, позже.

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