58

Есть ли простой способ добавить аргументы командной строки в приложение на Mac? Например, чтобы запустить Opera в режиме киоска или использовать другой профиль в Firefox, я могу набрать

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

В Windows я могу добавить аргументы к свойствам ярлыков, но поскольку Mac не использует ярлыки как таковые и не запускает приложения напрямую, это невозможно.

Я обнаружил, что запуск приложений через 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 остаются открытыми до тех пор, пока приложение открыто. Предположительно, использование команды open Applescript позволит избежать этого, но, поскольку я не запускаю приложение в том виде, в каком оно упаковано (просто /Applications/Firefox), оно не работает.

Итак, есть ли лучший способ для запуска приложений с аргументами командной строки? Если нет, есть ли способ предотвратить постоянный сеанс терминала или значок Applescript, чтобы оставаться открытым, пока приложение открыто?

редактировать

Согласно странице вики Mozilla, лучше всего использовать скрипт для запуска приложения с аргументами. Добавление & в конец скрипта убивает постоянное окно терминала. Единственное раздражение сейчас заключается в том, что он открывает мертвое, оконное окно терминала (которое лучше, чем постоянное, но все же ...)

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

9 ответов9

24

Начиная с OS X 10.6.2, команда open может передавать аргументы приложению, которое она открывает, с помощью флага --args. Используемый AppleScript выглядит следующим образом:

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

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

15

Вот мое лучшее решение: создайте Applescript с помощью:

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

И сохраните его как приложение.

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

Примечание. Сценарий не будет работать должным образом при запуске из редактора сценариев, а только при запуске из созданного вами приложения сценария.

11

Откройте Automator и создайте приложение с помощью одного действия Run Shell Script :

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

Это приложение запустит Firefox и сразу же закроется, оставив только работающий Firefox.


Или создайте приложение с помощью AppleScript Editor со следующим кодом AppleScript:

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

Оба работают нормально и не поддерживают приложение Terminal или скрипт более чем на секунду или около того. Используя Automator, вы можете даже создать Службу, если захотите.

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"). :(

7

В этом сценарии нет необходимости (как предлагали некоторые другие ответы) использовать killall (или аналогичный) для уничтожения родительского процесса приложения AppleScript («апплет»). Это может даже иметь неблагоприятные побочные эффекты, если имя / шаблон, заданный killall, совпадает с чем-то большим, чем просто процесс родительского апплета (например, другой, одновременно запускающий приложения AppleScript (если в качестве шаблона используется «applet»)).

Что-то вроде kill $PPID может быть более разумным, но мы можем не предполагать, что апплет приложения AppleScript всегда является непосредственным родителем оболочки, запускаемой сценарием do shell. К счастью, есть совершенно разумный способ сделать то, что вам нужно.

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

Используйте Script Editor, чтобы сохранить следующую программу как приложение AppleScript:

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

(добавлены функциональные разрывы строк, чтобы они были «узкими»; удалите ¬ и \\ и поместите все в одну длинную строку, если хотите)

Он будет работать достаточно долго для запуска Firefox и будет корректно завершать работу, пока Firefox продолжает работать.

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

Другие ответы, которые используют open inside, выполняют работу сценария оболочки, потому что open (фактически LaunchServices) выполняет эквивалентную работу по фонованию результирующей программы и отправке ее stdout и stderr в другое место.

4

AppleScript

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

Две точки там.

  1. Пространство освобождается обратной косой чертой, которая снова удаляется обратной косой чертой
  2. Апплет killall может вызвать проблемы, потому что могут работать другие апплеты
  3. Сохранить как программу

Однако это хорошо работает на 10.6.5

2

Следующее должно позволить вам указать аргументы командной строки для самого .app:

Щелкните правой кнопкой мыши по пакету .app, выберите "Показать содержимое пакета", перейдите к Info.plist, дважды щелкните по нему, найдите ключ Args, отредактируйте.

В данный момент у меня нет под рукой машины с OS X, поэтому я не могу проверить, можете ли вы также сделать это с псевдонимом (если вы хотите оставить исходный .app без аргументов и т.д.).

2

Почему вы не используете:

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

Просто, но это работает.

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. Теперь вы можете открыть панель запуска приложений.

Заметки:

  • Автоматические обновления упакованного приложения должны работать в большинстве случаев.
  • Должна быть возможность сделать любое перетаскивание на панель запуска, автоматически перенаправленную в упакованное приложение (с немного большим количеством сценариев).
  • Панель запуска автоматически завершает работу после запуска упакованного приложения.
  • Преимущество этого метода заключается в том, что существует небольшой риск прямого открытия упакованного приложения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .