Запустіть додаток на OS X за допомогою командного рядка


109

Я хочу запустити додаток на OSX зі сценарію. Мені потрібно передати це аргументи командного рядка. На жаль, openне приймає аргументи командного рядка.

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

Будь-які кращі пропозиції?


Я не можу слідувати за цим питанням. "open" не приймає аргументи командного рядка? Що "відкрито"? Це AppleScript відкрито? Як nohup &вирішується проблема?
S.Lott

4
man open (1) - команда OS X для запуску файлів чи програм
Нед Дейлі

3
Це має бути на superuser.com
Jeff Meatball Ян

Відповіді:


78

В OS X 10.6 openкоманду було вдосконалено, щоб дозволити передачу аргументів до програми:

open ./AppName.app --args -AppCommandLineArg

Але для старих версій Mac OS X, і тому, що пакети програм не розроблені для передачі аргументів командного рядка, звичайним механізмом є використання подій Apple для таких файлів, як тут, для додатків какао або тут для додатків Carbon. Можливо, ви також можете зробити щось незграбне, передаючи параметри, використовуючи змінні середовища.


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

2
Напевно, ні. Якщо це працює для вас, ідіть з ним. Більш суть полягає в тому, що open (1) - еквівалент кліпу того, що відбувається, коли користувач робить двічі клацання або «Відкрити» у Finder, і жоден із цих механізмів не підтримує звичайні аргументи командного рядка.
Нед Дейлі

+1: Ви не повинні використовувати аргументи командного рядка для додатків GUI Mac OS X.
С.Лотт

2
скажіть Google не використовувати аргументи командного рядка, Програми / 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 для таких файлів, як тут, для додатків какао або тут для додатків з вуглецю". Ось так створено Mac OS X. Так. Chrome порушує правила. Так само, як і кожен з утиліт командного рядка Linux. Але програми GUI, які відкриваються open, - як говорить відповідь - не розроблені для роботи з командного рядка. "Чому?" Тому що це так Mac OS X.
S.Lott

105

Як згадувалося в питанні тут , openкоманда в 10.6 тепер має argsпрапор, тож ви можете зателефонувати:

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


Працюючи саме так, як потрібно було. Дякую
DTdev

Це спрацювало і дозволило мені встановити zsh псевдонім для Chromium. Спасибі
jamescampbell

Ця відповідь чудова. Просто хотів додати, що коли ви вперше відкриєте Terminal, ви опинитесь у своєму домашньому каталозі, тому введіть його таким чином, щоб не потрібно переходити до каталогу додатків. Я хотів запустити Gimp, не завантажуючи шрифтів, що займає назавжди, тому я набираю це за допомогою перемикача -f, щоб опустити шрифти: open -n /Applications/GIMP.app --args -f
James

32

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

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

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


3
Бінарний приймає аргументи, я впевнений. Я це написав. Викликати "відкрито" не дозволяє передавати аргументи. Я майже впевнений у цьому. І так, мій сценарій викликає "відкритий бінарний файл" безпосередньо, не намагаючись відкрити пакет.
psychotik

@psychotik: Він не каже називати "відкритим бінарним файлом". Він каже, що безпосередньо виконувати двійкове.
Чак

Це не допоможе мені. Безпосереднє виконання двійкових результатів - це дочірній процес мого сценарію, чого я точно не хочу. Отже, необхідність використання open / nohup
psychotik

1
Якщо це скрипт оболонки, використовуйте 'exec', щоб замінити процес сценарію фактичним виконуваним файлом.
Джонатан Леффлер

2
Такий підхід має істотний недолік: якщо пакет містить призначені для користувача бібліотеки і бази, вам потрібно возитися з DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko

14

У випадку, якщо вашій програмі потрібно працювати з файлами (те, що ви зазвичай розраховуєте на передачу як ./myApp *.jpg:), ви зробите це так:

open *.jpg -a myApp

Це саме те, що я шукав! Моє опис, наприклад: open something.py -a Eclipse.app
Ерік

4

Я рекомендував би техніку, яку пропонує MathieuK. У моєму випадку мені потрібно було спробувати це з Chromium:

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

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


@Pacerier Додайте "&" до кінця цієї команди. Він запуститься у фоновому режимі. Потім ви можете закрити вікно свого терміналу, і програма, ймовірно, залишатиметься відкритою.
Пол Ірланд

2

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

open -a APP_NAME --args ARGS

Щоб відкрити відео у програвачі VLC, який має масштабуватись з коефіцієнтом 2x та циклом, ви, наприклад, виконали:

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

Зауважте, що я не зміг отримати висновок команд до терміналу. (хоча я нічого не намагався вирішити це)


Ви повторили 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. Іншими словами, regChromeдля нормального перегляду та altChromeвикористання спеціального профілю мені було потрібно два звичайних додатки для Mac , щоб це було легко розпочато клавішею ⌘-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 перечитує свій файл значків і отримує той, що відповідає тому, що з двох додатків було запущено останнім, в результаті чого дві запущені програми з тим самим значком. Але я не намагався це виправити - я тримаю два браузери на окремих робочих столах, і навігація між ними не була проблемою.


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;

перевірте редактор сценаріїв / вікно / бібліотеку на список програм, у яких доступна автоматизація яблучних сценаріїв. Я шукав Vysor на базі Chrome, і думаю, що мені потрібен інший спосіб.
AnneTheAgile

Більше складності ftw!
Pacerier

1

З яблучним сценарієм:

tell application "Firefox" to activate

Як ви передаєте аргументи Firefox? Наприклад, -но-віддалений -П "Інший профіль". Розробляючи додатки та інше, зручно мати два окремих 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. Однак вам потрібно стежити за змінами під час оновлення ОС.


"Пам'ятайте, що MacOS заснований на Linux". Ні, ні, це не так, macOS та Linux не поділяють жодного рядка коду. MacOS - це UNIX з ядром на основі FreeBSD.
Томас

Зміниться. Я не хочу створювати релігійну війну. Мета полягала в тому, щоб громада знала, що є кілька потужних варіантів, якими користувачі MacOS можуть скористатися.
zerocog

Звичайно, без проблем! :)
Томас

0

Просто, тут замініть "APP" на ім'я програми, яке ви хочете запустити.

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

Пізніше дякую.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.