2009-08-20 3 views
90

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

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

Любые лучшие предложения?

+0

Я не могу ответить на этот вопрос. «open» не принимает аргументы командной строки? Что «открыто»? Открыт ли AppleScript? Как «nohup &» решает проблему? –

+4

man open (1) - команда OS X для запуска файлов или приложений –

+3

Это должно быть на superuser.com –

ответ

58

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

open ./AppName.app --args -AppCommandLineArg 

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

+0

Мой подход kludgey заключается в том, чтобы вызвать исполняемый файл непосредственно с помощью командной строки args, используя nohup - если среда-vars-kludge меньше kludgey? – psychotik

+2

Наверное, нет. Если это сработает для вас, пойдите с ним. Большей точкой является то, что open (1) является эквивалентом cli того, что происходит, когда пользователь выполняет двойной щелчок или «Открыть» в Finder, и ни один из этих механизмов не поддерживает обычные аргументы командной строки. –

+0

+1: Вам не следует использовать аргументы командной строки для приложений Mac OS X GUI. –

29

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

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

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

+3

Двоичный принимает аргументы, я уверен. Я написал это. Вызов 'open' не позволяет передавать аргументы. Я в этом уверен. И да, мой скрипт напрямую вызывает «открытые двоичные файлы», не пытаясь открыть пакет. – psychotik

+0

@psychotik: Он не говорит, чтобы назвать «открытым двоичным». Он говорит, что нужно выполнить двоичный код. – Chuck

+0

Это не сработает для меня. Непосредственно выполнение двоичных результатов в нем является дочерним процессом моего скрипта, чего я определенно не хочу. Следовательно, необходимость использования open/nohup – psychotik

4

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

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

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

+0

Но вам нужно держать терминал открытым ... . – Pacerier

+0

@Pacerier Добавьте символ '&' в конец этой команды. Он запустится в фоновом режиме. Затем вы можете закрыть окно терминала, и приложение, скорее всего, останется открытым. –

98

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

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

+0

Работайте так, как это было необходимо. Спасибо – Durgesh

+0

Это сработало и позволило мне установить псевдоним zsh для Chromium. Спасибо – jamescampbell

+0

Этот ответ замечательный. Просто хотел добавить, что при первом открытии терминала вы будете в своем домашнем каталоге, поэтому введите его так, чтобы вам не нужно было переключаться в каталог приложения. Я хотел запустить Gimp без загрузки шрифтов, которые берут навсегда, поэтому я набираю это с ключом -f, чтобы опустить шрифты: open -n /Applications/GIMP.app --args -f –

1

С AppleScript:

tell application "Firefox" to activate 
+0

Как передать аргументы в Firefox ? Например, -no-remote -P «Другой профиль». При разработке надстроек и т. Д. Удобно иметь два отдельных процесса Firefox, используя два отдельных профиля. Ваш обычный профиль и песочница для отладки вашего расширения. – George

+0

Я считаю, что вы имеете в виду директиву AppleScript, но вопрос об открытии из командной строки ... – conny

13

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

open *.jpg -a myApp 
+0

Это именно то, что я искал! Мое инстанцирование, например: 'open something.py -a Eclipse.app' – Eric

1

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

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

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

+0

Mac испорчен. Изоляция и песочница являются основными принципами удобства использования, безопасности и надежности. В любом случае, почему не работает 'open -args'? Использует ли 'make shell script' единственный способ? – Pacerier

2

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

This page gives a good example example script, который может быть записан в командной строке с использованием 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; 
+0

проверить редактор сценариев/окно/библиотеку для списка приложений, у которых есть автоматизация аппликации. Я искал Vysor, основанный на Chrome, и я думаю, что мне нужен другой способ. – AnneTheAgile

+0

Больше сложности ftw! – Pacerier

1

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

open -a APP_NAME --args ARGS 

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

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

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

+0

Вы повторяли 'open -a' намеренно ?? В любом случае, 'open -a/Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome -args -user-data-dir =/Users/an/userll' не работает для меня. – Pacerier

+0

Простите, мой синтаксис полностью отключен по какой-то причине. Я сейчас обновляюсь. – rien333

Смежные вопросы