2009-08-01 09:24:24 +0000 2009-08-01 09:24:24 +0000
60
60

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

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

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

Правка

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

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

Ответы (9)

30
30
30
2010-03-04 20:13:16 +0000

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

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

Это должно дать вам все необходимое поведение.

18
18
18
2009-08-01 11:56:26 +0000

Вот мое лучшее решение: Создать Applescript с:

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

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

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

Заметка: Сценарий будет работать некорректно при запуске из Script Editor, только при запуске из созданного вами скриптового приложения.

14
14
14
2011-01-22 13:04:27 +0000

Откройте Automator и создайте Application с помощью одного действия 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"

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

8
8
8
2011-03-13 03:59:54 +0000

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

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

Per 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 продолжает работать.

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

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

8
8
8
2014-08-22 20:50:57 +0000

Это старая дискуссия, но все еще появляется в поисках Google, поэтому я решил добавить пару ¢.

Наверное, лучше использовать “идентификатор пакета”, а не абсолютный путь к исполняемому файлу:

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

Или в Apple Script:

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

Что я еще не понял, так это как открыть новый экземпляр/окно с другим профилем, когда первый уже открыт. (Если я запущу AppleScript выше, а затем другой с “Profile 2”, то Chrome все равно откроет еще одно окно как “Profile 1”). :((

4
4
4
2011-01-22 12:48:22 +0000

AppleScript

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

Два балла там.

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

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

3
3
3
2009-08-01 10:30:41 +0000

Далее следует указать аргументы командной строки для самого .app: 0x2 и 0x2 и щелкните правой кнопкой мыши на .app, выберите “Показать содержимое пакета”, перейдите к Info.plist, дважды щелкните по нему, найдите ключ Args, отредактируйте.

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

2
2
2
2011-03-22 19:32:58 +0000

Заверните ваше приложение в пусковую установку AppleScript.

Вот шаги.

  1. Создайте AppleScript со следующим содержимым и сохраните его как приложение (в этом примере он называется “Firefox 3 launcher.app”).

  2. Доберитесь до этого приложения в Поисковике, щелкните правой кнопкой мыши по нему, покажите содержимое пакета.

  3. Поместите ваше приложение в корень содержимого пакета. (В данном примере это будет “Firefox 3.app”)

  4. Теперь вы можете открыть запуск вашего приложения.

Заметки:

  • Автоматическое обновление обернутого приложения должно работать в большинстве случаев.
  • Должна быть возможность сделать так, чтобы любое перетаскивание на пусковую установку автоматически перенаправлялось на обернутое приложение (с чуть большим количеством сценариев).
  • Машина запуска автоматически выходит после запуска обернутого приложения.
  • Преимущество этого способа заключается в том, что есть несколько рисков открытия обернутого приложения напрямую.
1
1
1
2019-03-29 23:38:35 +0000

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

open /Applications/TextEdit.app --args example.txt

Похожие вопросы

12
7
5
15
7