Выполнение сценариев оболочки из OS X Dock?

160

Как настроить сценарий оболочки для запуска из док-станции Mac OSX? Кажется, что просто создание ярлыка откроет файл в моем редакторе. Есть ли флаг, который мне нужно установить где-нибудь, чтобы он запустился вместо открытия для редактирования?

Wilco
источник
2
+1 +1 исключительно для аватара, хотя тема мне тоже нравится.
Мэтт Баннер
Возможно, вы захотите рассмотреть возможность перехода на второй ответ @Wilco. Я думаю, что это лучший ответ.
Серый

Ответы:

190

Вы можете создать рабочий процесс Automator за один шаг - «Run Shell Script»

Затем File > Save Asи измените формат файла на «Приложение». Когда вы откроете приложение, оно выполнит шаг Shell Script, выполнив команду и выйдя из нее после ее завершения.

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

(Automator находится в вашей /Applicationsпапке!)

Пример рабочего процесса

DBR
источник
6
@dbr, толкатель кнопки GUI! :) Шучу, это хорошее предложение!
будет
Да, это было отличное предложение :) Я даже написал действия Automator для некоторых своих приложений, и я все еще забываю об этом в такие моменты :)
Джейсон Коко
Я не могу заставить это работать с nohup, а-ля "nohup / usr / bin / myscript &; disown -a && exit 0". Мне нужно приложение / рабочий процесс для запуска скрипта и немедленного выхода. Любые идеи? :-)
2010 года
3
@martineau Если вы откроете приложение, сделав open -a SomeAppThing.app --args --etc=2это, следует сосредоточиться. В качестве альтернативы вы можете сфокусировать его, используя Applescript (например osascript -e 'tell application "Google Chrome" to activate')
dbr
1
Примечание: если ваш скрипт запускает приложение с графическим интерфейсом, которое некоторое время будет оставаться открытым, на панели задач будет отображаться постоянно вращающийся значок шестеренки, пока приложение не закроется. Один из обходных путей - добавить `&> / dev / null &` к стартовой строке скрипта, чтобы Automator не ждал.
ewall
50

Если вам не нужно окно терминала, вы можете сделать любой исполняемый файл приложением, просто создав сценарий оболочки Exampleи переместив его в имя файла Example.app/Contents/MacOS/Example. Вы можете поместить это новое приложение в вашу док-станцию, как и любое другое, и запустить его одним щелчком мыши.

ПРИМЕЧАНИЕ: название приложения должно точно соответствовать имени скрипта. Таким образом, каталог верхнего уровня должен быть Example.appи скрипт в Contents/MacOSподкаталоге должен быть назван Example, и скрипт должен быть исполняемым.

Если вам нужно отобразить окно терминала, у меня нет простого решения. Возможно, вы могли бы что-то сделать с Applescript, но это не очень чисто.

Джереми Бэнкс
источник
1
Вы случайно не знаете, существует ли простой способ передачи файлов в качестве аргументов скрипту оболочки? Для файлов, открытых с помощью «Открыть с помощью ...».
Fuzzy76
9
Для тех, кто пытается это сделать - имя приложения должно точно соответствовать имени скрипта. Так должно быть example.sh.app, а не только example.app. Вы получите предупреждение о поврежденном приложении, если они не совпадают
Kip
1
Чтобы уточнить - я нуб OSX - вы имеете в виду просто создать структуру папок, подобную той, что показана в вашем примере, с файлом сценария, помещенным в него, как показано?
Мартино
2
@martineau Да, это правильно. Если вы создадите папку, имя которой оканчивается .appэтой структурой, и она будет считаться исполняемым приложением. Если вы хотите просмотреть содержимое этой папки в Finder, вам нужно щелкнуть по ней правой кнопкой мыши и выбрать «просмотреть содержимое пакета» (потому что двойной щелчок по нему запустит приложение). В Терминале это будет просто папка. (Я не уверен, что Finder позволит вам переименовать папку в .app самостоятельно; возможно, вам придется выполнить переименование в терминале.)
Джереми Бэнкс
1
Я просто попытался сделать это и получил сообщение об ошибке в El Capitan (10.11): «Вы не можете открыть ...., поскольку приложения PowerPC больше не поддерживаются». : D Это довольно интересно!
AllenH
26

На OSX Mavericks:

  1. Создайте свой сценарий оболочки.
  2. Сделайте ваш сценарий оболочки исполняемым:

    chmod +x your-shell-script.sh
  3. Переименуйте ваш скрипт, чтобы иметь .appсуффикс:

    mv your-shell-script.sh your-shell-script.app
  4. Перетащите скрипт в док OSX.
  5. Переименуйте ваш скрипт обратно в .shсуффикс:

    mv your-shell-script.app your-shell-script.sh
  6. Щелкните правой кнопкой мыши файл в Finder и выберите параметр «Получить информацию».
  7. В нижней части окна установите сценарий оболочки, который будет открываться с помощью терминала.

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

Бонус: чтобы заставить терминал закрыться после завершения сценария, добавьте exit 0в конец и измените настройки терминала, чтобы «закрыть оболочку, если она завершена чисто», как сказано в этом SO-ответе .

stiemannkj1
источник
Хорошо, это сработало для меня, любой шанс, случайно, икона, мне интересно. К вашему сведению: ТАКЖЕ, шаг 7 относится к файлу, а не к пункту меню ...
Майк Q
кстати приятно! просто все .sh с открытым терминалом.
iHTCboy
@ stiemannkj1, это показывает значок, когда приложение работает? Есть ли способ это скрыть?
Pacerier
@Pacerier, извините, я больше не на OSX (переключился на Linux :)). Возможно, вы захотите попробовать ответ Джереми Банка . У меня нет других идей, и, поскольку у меня нет OSX, я не могу ни тестировать, ни связываться с чем-либо, чтобы попытаться показать / скрыть иконку ..
stiemannkj1
17

Я знаю, что это старый, но в случае, если это полезно для других:

Если вам нужно запустить скрипт и хотите, чтобы терминал всплывал, чтобы вы могли видеть результаты, которые вы можете сделать, как сказал Abyss Knight, и измените расширение на .command. Если вы дважды щелкните по нему, откроется окно терминала и запустите.

Мне, однако, нужно было это запустить из Automator или AppleScript. Таким образом, чтобы открыть новый терминал, я запустил команду «запустить сценарий оболочки» «open myShellScript.command», и она открылась в новом терминале.

Джейсон Толструп
источник
замечательно, спасибо! Теперь всем нужно сделать идеальное решение - это закрыть окно терминала после завершения скрипта.
Питер М
1
хорошо, если у вас есть закрытое окно при выходе, выбранное в настройках терминала, вы можете добавить команду выхода в ваш скрипт, и у вас будет то, что вы хотите.
Джейсон Толструп
7

Пока ваш скрипт исполняемый и не имеет никакого расширения, вы можете перетаскивать его как есть на правую сторону (сторона документа) Dock, и он будет запускаться в окне терминала при нажатии вместо открытия редактора.

Если вы хотите иметь расширение (например, foo.sh), вы можете перейти к окну информации о файле в Finder и изменить приложение по умолчанию для этого конкретного сценария из того, что есть (TextEdit, TextMate, независимо от того, какое значение по умолчанию установлено на вашем компьютере для .sh файлы) в Терминал. Затем он будет просто выполняться вместо открытия в текстовом редакторе. Опять же, вам придется перетащить его на правую сторону дока.

Джейсон Коко
источник
1
ПРИМЕЧАНИЕ : это работает как чемпион в OS X 10.10 Yosemite. Я не могу комментировать 10,9
Брайан Эш
1
Работает на 10.11. Спасибо!
Яссин Имуначен
Работает и на 10.12! Возможно, мой комментарий о 10.9 был неверным, но я заметил, что вам нужно убедиться, что вы перетаскиваете его в часть дока под разделителем. У меня нет возможности повторно протестировать 10.9, к сожалению.
stiemannkj1
Не нужно добавлять его в док. Его можно запустить с рабочего стола. Но не может быть никакого расширения. Сделайте его исполняемым, и вы можете просто дважды щелкнуть. Это самый простой вариант, который я видел.
Богатая Аподака
5

Я думаю, что эта тема может быть полезна: http://forums.macosxhints.com/archive/index.php/t-70973.html

Перефразируя, вы можете переименовать его с расширением .command или создать AppleScript для запуска оболочки.

willasaywhat
источник
По крайней мере, на Snow Leopard добавление расширения .command к скрипту заставляет его работать в терминале, если вы дважды щелкнете по нему, но по какой-то причине вы все равно не можете перетащить его в док. Предложения дбр и Джереми оба сработали для меня, хотя.
Джо Лисс
5

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

Shell Script

  1. Создайте свой сценарий оболочки в вашем любимом текстовом редакторе, например:

    mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe"

    (запускается исполняемый файл w32 с использованием моно-фреймворка)

  2. Сохраните скрипт оболочки, для моего примера «StartKeepass.sh»

Apple Script

  1. Откройте редактор AppleScript и вызовите скрипт оболочки

    do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "<enter username here>" password "<Enter password here>" with administrator privileges

    • do shell script - командаScript для вызова внешних команд оболочки
    • "sh ...." - это ваш сценарий оболочки (полный путь), созданный на первом этапе (вы также можете запускать прямые команды, я мог бы пропустить сценарий оболочки и просто запустить мою моно команду здесь)
    • user name - объявляет appleScript, что вы хотите запустить команду от имени конкретного пользователя
    • "<enter username here> - заменить своим именем пользователя (с сохранением кавычек) от "Джош"
    • password - объявляет паролем свой пароль
    • "<enter password here>" - заменить своим паролем (с сохранением кавычек) ex "mypass"
    • with administrative privileges - заявляет, что вы хотите работать от имени администратора

Создайте свой .APP

  1. сохраните ваш яблочный скрипт как filename.scpt, в моем случае RunKeepass.scpt

  2. сохраните как ... ваш appleScript и измените формат файла на приложение, в результате чего в моем случае будет RunKeepass.app

  3. Скопируйте файл приложения в папку приложений

CJoshDoll
источник
5

В редакторе скриптов:

do shell script "/full/path/to/your/script -with 'all desired args'"

Сохранить как пакет приложений.

Пока все, что вы хотите сделать, это получить эффект от сценария, это будет работать нормально. Вы не увидите STDOUT или STDERR.

Джо МакМахон
источник
2
Я бы предложил: «Сохранить как приложение BUNDLE». Пакеты запускаются намного быстрее, чем приложения.
e.James
-3

Кто-то написал ...

Я просто установил все файлы, которые заканчиваются на ".sh", чтобы открывать с помощью терминала. Он отлично работает, и вам не нужно менять имя каждого сценария оболочки, который вы хотите запустить.

Jonny
источник