Запустить приложение на 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
Спасибо мне позже.