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

110

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

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

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

психотик
источник
Я не могу понять вопрос. "open" не принимает аргументы командной строки? Что «открыто»? Это AppleScript открытый? Как nohup &решить проблему?
S.Lott
4
man open (1) - команда OS X для запуска файлов или приложений
Нед Дейли,
3
Это должно быть на superuser.com
Джефф Фрикаделька Ян

Ответы:

79

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

open ./AppName.app --args -AppCommandLineArg

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

Нед Дейли
источник
Мой kludgey подход состоит в том, чтобы вызывать исполняемый файл напрямую с аргументами командной строки, используя nohup - если environment-vars-kludge менее kludgey?
psychotik
2
Возможно нет. Если это работает для вас, продолжайте. Важнее то, что open (1) - это cli-эквивалент того, что происходит, когда пользователь делает двойной щелчок или «Открыть» в Finder, и ни один из этих механизмов не поддерживает обычные аргументы командной строки.
Нед Дейли,
+1: вы не должны использовать аргументы командной строки для приложений Mac OS X GUI.
S.Lott
2
скажите Google не использовать аргументы командной строки, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - -force-fieldtest
Anurag Uniyal
@Anurag Uniyal. "Зачем?" Вы прочитали ответ? «Обычный механизм - использовать Apple Events для файлов, например, здесь для приложений Cocoa или здесь для приложений Carbon». Так устроена Mac OS X. Да. Chrome нарушает правила. То же самое и с каждой из утилит командной строки Linux. Но приложения с графическим интерфейсом, которые открываются с помощью open, - как сказано в ответе - не предназначены для работы из командной строки. "Зачем?" Потому что такова Mac OS X.
S.Lott
105

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

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

Джон МакДоннелл
источник
Работает именно так, как требовалось. Спасибо
DTdev 04
Это сработало и позволило мне установить псевдоним zsh для Chromium. Спасибо
jamescampbell
Это отличный ответ. Просто хотел добавить, что когда вы впервые откроете Терминал, вы окажетесь в своем домашнем каталоге, поэтому введите его так, чтобы вам не нужно было переключаться в каталог приложения. Я хотел запустить GIMP без загрузки шрифтов, что занимает вечность, поэтому я набираю это с переключателем -f, чтобы опустить шрифты: open -n /Applications/GIMP.app --args -f
Джеймс Туми,
32

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

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

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

NSSec
источник
3
Я уверен, что двоичный файл принимает аргументы. Я это написал. Вызов open не позволяет передавать аргументы. Я почти уверен в этом. И да, мой сценарий вызывает «открытый двоичный файл» напрямую, а не пытается открыть пакет.
psychotik
@psychotik: Он не говорит, что нужно называть «открытый двоичный код». Он говорит напрямую выполнить двоичный файл.
Чак,
Для меня это не сработает. Непосредственное выполнение двоичного файла приводит к тому, что он становится дочерним процессом моего скрипта, чего я определенно не хочу. Следовательно, необходимость использовать open / nohup
psychotik
1
Если это сценарий оболочки, используйте exec, чтобы заменить процесс сценария фактическим исполняемым файлом.
Джонатан Леффлер
2
Такой подход имеет существенный недостаток: если пакет содержит пользовательские библиотеки и базы, вам нужно возиться с DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko
14

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

open *.jpg -a myApp
eshedg
источник
Это именно то, что я искал! Мой экземпляр, например: open something.py -a Eclipse.app
Эрик
4

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

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

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

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

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

open -a APP_NAME --args ARGS

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

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

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

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

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

Джордж
источник
2

Начиная с 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;
Mowzer
источник
проверьте Script Editor / Window / Library, чтобы получить список приложений, в которых доступна автоматизация applescript. Искал Vysor, основанный на Chrome, и думаю, мне нужен другой способ.
AnneTheAgile
Сложнее ftw!
Pacerier
1

С помощью applescript:

tell application "Firefox" to activate
Кейт
источник
Как передать аргументы Firefox? Например, -no-remote -P «Другой профиль». При разработке надстроек и тому подобного удобно иметь два отдельных процесса Firefox с использованием двух отдельных профилей. Ваш обычный профиль и песочница для отладки вашего расширения.
Джордж
Я полагаю, вы имеете в виду директиву AppleScript, но вопрос заключается в открытии из командной строки ...
conny
0

Почему бы просто не указать путь к корзине приложения. Для 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. Однако вам необходимо отслеживать изменения при обновлении ОС.

оборота Zerocog
источник
«Помните, что MacOS основана на Linux». Нет, нет, macOS и Linux не используют ни одной строки кода. MacOS - это UNIX с ядром, основанным на FreeBSD.
Thomas
Изменится. Я не хочу создавать религиозную войну. Цель состояла в том, чтобы сообщить сообществу, что есть несколько мощных опций, которые могут использовать пользователи MacOS.
zerocog
Конечно, нет проблем! :)
Thomas
0

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

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

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

Kiran Sk
источник
0

Вы можете запускать приложения, используя open:

open -a APP_YOU_WANT

Это должно открыть нужное вам приложение.

user13549667
источник