Як запустити програму з аргументами командного рядка в Mac OS


60

Чи є простий спосіб додати аргументи командного рядка до програми на Mac? Наприклад, щоб запустити Opera в режимі кіоску або використовувати інший профіль у Firefox, я можу набрати

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

У Windows я можу додати аргументи до властивостей ярлика, але оскільки Macs не використовує ярлик як такий, а запускає програми безпосередньо, це неможливо.

Я виявив, що запуск програм через bash або Applescript частково працює:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

Я можу зробити ці виконувані файли і призначити піктограму, і все працює чудово, за винятком випадків, коли я запускаю будь-яку з цих псевдопрограм, або вікно термінала, або піктограма Applescript залишаються відкритими, доки програма не відкрита. Імовірно, використання команди Applescript openуникне цього, але оскільки я не запускаю програму, оскільки вона упакована (просто /Applications/Firefox), вона не працює.

Отже, чи є кращий спосіб запустити програми з аргументами командного рядка? Якщо ні, чи є спосіб запобігти постійному сеансу терміналу або значку Applescript залишатися відкритим, поки програма відкрита?

Редагувати

За даними сторінки Mozilla Wiki , найкраще використовувати сценарій для запуску програми з аргументами. Додавання в &кінець сценарію вбиває стійке вікно терміналу. Єдине роздратування в тому, що воно відкриває мертве, закрите вікно терміналу (що краще, ніж стійке, але все ж ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &

2
Я все ще сподіваюся на кращі відповіді на це ...
Крегокс

Якщо ви запускаєте завдання, &яке все ще належить до терміналу, ви можете це виправити, додавши рядок disown %/Applications/Firefox.app/Contents/MacOS/firefox після запуску, а потім можете безпечно закрити термінал, використовуючи AppleScript.
окудо

шукайте відповідь Даніеля - це найповніший і ідеальний на сьогоднішній день (OSX 10.6.2 +).
Крегокс

Відповіді:


17

Ось найкраще рішення: Створіть Applescript за допомогою:

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

І збережіть це як додаток .

Ви можете поставити будь-яку програму з будь-якими аргументами в першій частині. Частина після того, як &потрібно вбити все, що ви назвали своїм скриптом + .app. Ви побачите, що додаток для сценарію спалахне на доці, але воно зникне.

Примітка. Сценарій не працюватиме належним чином при запуску з редактора сценаріїв, лише коли він запускається із створеного вами програми сценарію.


Це майже працює. Він все ще чекає, коли екземпляр Firefox буде виконаний, поки він не запустить killall, тому він викликає налагоджувач, коли я закриваю Firefox, а додаток для сценарію все ще не виходить. Гммм ...
Андрій

Це дивно. Ви зберігаєте його як додаток, а потім двічі клацніть додаток? Він не працюватиме при запуску з редактора сценаріїв.
MJeffryes

Також я помічаю, що я вставив новий рядок перед &. Видаліть новий рядок, якщо він у вас є
MJeffryes

тут немає необхідності & killall у Snow Leopard 10.6.x - але також не вдалося знайти жодного способу змусити програму вбити його самостійно, як тільки виконати.
Крегокс

1
@Pacerier Перевірте дати цієї відповіді.
MJeffryes

28

Починаючи з OS X 10.6.2, команда open може передавати аргументи до програми, яку вона відкриває, за допомогою прапора --args. AppleScript для його використання виглядає приблизно так:

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

Це повинно дати вам всю поведінку, яку ви хочете.


"людина відкрита", і ось вона! працював як шарм. --арг прапор, а потім ваші аргументи.
Майкл Діммітт

1
Я спробував --argsіз Chrome, і він не працює. Він працюватиме лише для першої інстанції . Якщо ви намагаєтеся запустити два --user-data-dirодночасно, ви не можете це зробити, openале потрібно запустити його за старим /applications...методом. Хтось знає, чому трах --args не працює?
Pacerier

1
@Pacerier, "open -n"
Саймон Райт

Щоб додати до цього, ви можете створити сценарій у редакторі сценаріїв, а потім зберегти як додаток.
Кевін С.

11

Відкрийте Automator і створіть додаток за допомогою однієї дії Run Shell Script :

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

Ця програма запустить Firefox та миттєво закриє, залишаючи лише Firefox.


Крім того, створіть програму за допомогою редактора AppleScript із таким кодом AppleScript:

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

І те, і інше працюють добре, і не підтримують термінал або програму скриптів більше ніж секунду. Використовуючи Automator, ви навіть можете створити Сервіс, якщо вирішите.


1
Тільки майте на увазі, що open --argsбуло реалізовано в 10.6.2, як уже згадував Боб.
Крегокс

Використовуючи його для: open eclipse.app -nвідкриття другої робочої області Eclipse. Дуже зручно. Дякую!
jonalv

Не вдалося змусити його працювати в Automator за допомогою дії "Запустити скрипт оболонки" в MacOS 10.14. Я все-таки мав успіх у AppleScript.
Кевін С.

8

Це давнє обговорення, але все ще виникає в пошуку Google, тому я подумав, що я додам пару ¢.

Напевно, краще використовувати "ідентифікатор групи", а не абсолютний шлях до виконуваного файлу:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Або в сценарії Apple:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

Що я ще не зрозумів - це відкрити новий екземпляр / вікно з іншим профілем, коли перший вже відкритий. (Якщо я запускаю AppleScript вище, потім інший з "Профіль 2", то Chrome все одно просто відкриє інше вікно як "Профіль 1"). :(


Чи -b функціонально дорівнює -a? Чим вони відрізняються?
Pacerier

7

Не потрібно (як деякі інші відповіді пропонували) використовувати killall (або подібне) для вбивства батьківського процесу застосування AppleScript ("аплет") у цьому сценарії. Це навіть може мати несприятливі побічні ефекти, якщо ім’я / шаблон, наданий killall, відповідає більше, ніж просто батьківський аплет (наприклад, інші, одночасно запущені програми AppleScript (якщо в якості шаблону використовується "аплет")).

Щось подібне kill $PPIDможе бути більш розумним, але ми можемо не хотіти припускати, що аплет програми AppleScript - це завжди безпосередній батько оболонки, запущений скриптом do shell . На щастя, існує цілком розумний спосіб зробити те, що потрібно.

Відповідно до TN2065 (у розділі "Я хочу запустити фоновий сервер; як зробити так, щоб скрипт оболонки не чекав, поки команда завершиться?"), Правильним методом є перенаправлення stdout і stderr і змушення оболонки запускати програму у фоновому режимі .

Використовуйте редактор сценаріїв, щоб зберегти таку програму як додаток AppleScript:

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

(додаються функціональні розриви рядків, щоб вони залишалися "вузькими"; видаліть ¬і, \\якщо потрібно , видаліть це все на одному довгій лінії

Він запуститься досить довго, щоб запустити Firefox, і вийде чисто, поки Firefox продовжує працювати.

Перенаправлення необхідне, оскільки сценарій оболонки не тільки чекає виходу його найближчого дочірнього (оболонки), але й чекає (усі екземпляри) записуваних кінців труб, які він створює, для закриття вивороту і stderr оболонки . Stdout оболонки і stderr ( труби сценарію оболонки ) успадковуються програмами, з якими вона працює без перенаправлення (навіть ті, що працюють у фоновому режимі &); перенаправлення гарантує, що оболонка є останньою для утримування записуваних кінців труб. Таким чином, скрипт do shell повернеться одразу після закінчення оболонки, що дозволить самому додатку AppleScript вийти (оскільки сценарій do shell - це останній вираз у програмі AppleScript).

Інші відповіді, які використовують відкритий всередині, виконують скрипт оболонки, тому що open (насправді LaunchServices) виконує еквівалентну роботу з фоновим фоном результуючої програми та відправленням її stdout та stderr в інше місце.


це дуже цікаво. Цікаво, чи працює вона до 10.6.2 ... але я все ще думаю, що використання open --argsвиглядає чистіше. Чи є недолік використання будь-якого з них?
Крегокс

1
Я знаю, що цей метод працює в 10.4. Моє враження, що сценарій оболонки завжди працював так (він був доданий до Standard Additions OSAX в AppleScript 1.7 , який поставляється з Mac OS X 10.1). Якщо ви готові припустити 10,6, то open --argsце, мабуть, добре.
Кріс Джонсен

@ChrisJohnsen, Link down ........
Pacerier

4

AppleScript

do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

Два пункти там.

  1. Простір виходить за допомогою косої косої риси, яка знову повертається за допомогою нахилу
  2. Аплет killall може спричинити неприємності, оскільки можуть працювати інші аплети
  3. Збережіть його як програму

Однак він працює добре 10.6.5


appletвідноситься до?
Pacerier

3

Далі слід вказати аргументи командного рядка для самого .app:

Клацніть правою кнопкою миші пакет .app, виберіть "Показати зміст пакета", перейдіть до Info.plist, двічі клацніть його, знайдіть клавішу Args, відредагуйте.

На даний момент у мене не є зручна машина OS X, тому я не можу перевірити, чи можете ви також зробити це з псевдонімом (якщо ви хочете зберегти оригінальний архів аргументів .app та ін.).


На жаль, у ключі немає ключа аргументів. За словами Mozilla, ви повинні використовувати скрипт - wiki.mozilla.org/MailNews:Logging#Mac
Ендрю

Зауважте також, що зміна вмісту пакета (наприклад, Info.plist) може спричинити проблеми з підписанням коду: bridge.grumpy-troll.org/2011/01/…
drevicko

2

Оберніть свою програму всередині запуску AppleScript.

Ось етапи.

  1. Створіть AppleScript із наступним вмістом і збережіть його як додаток (у цьому прикладі він називається "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Перейдіть до цієї програми у Finder, клацніть правою кнопкою миші та покажіть вміст пакета.

  3. Покладіть свою програму в корінь вмісту пакета. (У цьому прикладі це було б "Firefox 3.app")

    Результат: / Додатки / Firefox 3 launcher.app/Firefox 3.app

  4. Тепер ви можете відкрити запуск програми.

Примітки:

  • Автоматичні оновлення завершеного додатка повинні працювати в більшості випадків.
  • Повинно бути можливим зробити будь-яке перетягування до пускового пристрою автоматично перенаправлене на обгорнуту програму (з трохи більше сценаріїв).
  • Після запуску загорнутої програми програма запуску автоматично закривається.
  • Перевагою цього методу є те, що існує мало ризиків відкрити обгорнуту програму безпосередньо.

1

Чому ви не використовуєте:

#!/bin/sh
open /Applications/Firefox.app

Просто, але це працює.


2
Термін відкриється, якщо ви це зробите.
MJeffryes

0

У openкоманди є необов'язковий --argsаргумент, значення якого буде передано відкритій програмі як аргументи. Наприклад:

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