Как запустить сценарий оболочки в OS X двойным щелчком мыши?

233

У меня есть сценарий оболочки, который имеет разрешение на выполнение пользователем в OS X, но когда я дважды щелкаю по нему, он открывается в текстовом редакторе. Как я могу запустить его, дважды щелкнув по нему?

C2H2
источник

Ответы:

266
  • Сначала в терминале сделайте скрипт исполняемым, набрав:

    chmod a+x (yourscriptname)
  • Затем в Finder щелкните правой кнопкой мыши свой файл и выберите «Открыть с помощью», а затем «Другие ...».

  • Здесь вы выбираете приложение, в которое хотите запустить файл, в данном случае это будет Терминал. Чтобы выбрать терминал, вам нужно переключиться с «Рекомендуемых приложений» на «Все приложения». (Приложение Terminal.app можно найти в папке Utilities)

  • Обратите внимание, что если вы не хотите связывать все файлы с этим расширением для запуска в терминале, вы не должны проверять «Всегда открывать с».

  • После нажатия OK вы сможете выполнить скрипт, просто дважды щелкнув по нему.
Lus
источник
спасибо, я получил его, я не знал, чтобы связываться с терминалом, я думал, что нужно связать с / bin / sh
c2h2
22
Я не мог найти Terminal.app в списке, пока не понял, что мне нужно искать в папке «Утилиты». Надеюсь, это сэкономит кому-то время.
Гленн Лоуренс,
27
В OSX 10.8 и более поздних версиях исполняемый сценарий, имена которого не имеют суффикса или суффикса .command, по умолчанию является исполняемым из Finder без необходимости указывать Finder, как его открывать.
mklement0
1
«Все приложения» - это настройка, которую мне не хватало ... вероятно, что испытал и Черувим. Что касается комментария Гленна: вы можете просто использовать встроенную функцию поиска в правом верхнем углу окна; убедитесь, что вы вводите полное имя приложения, то есть Terminal.app.
старший старший
3
Не чистый способ сделать это. Переименуйте ваш скрипт в .commandрасширение файла.
Бахсау
227

Вы пытались использовать .commandрасширение имени файла?

Хэгелин
источник
3
Это лучше. В ответе @Lus рабочая папка не та, что вы открываете скрипт.
Родриго
6
Есть ли способ запустить «фоновые» задачи без консольного окна?
Lapo
6
Обратите внимание, что текущая директория может быть не той, в которой находится ваш скрипт. Взгляните на этот вопрос, чтобы исправить его: stackoverflow.com/questions/59895/…
Павел Алексеев
14
Вам все еще нужно иметь разрешение на выполнение ( chmod +x), но .commandрасширение уже связано с терминалом. Отличное решение, спасибо
NorTicUs
Видимо, пользователь не может взаимодействовать с терминальной программой этим методом - разве я не ошибаюсь?
Демис
153

По состоянию на OSX 10.10 (Yosemite) и с тех пор по крайней мере OS X 10.8 (Mountain Lion) , поведение выглядит следующим образом, когда вы открыты (двойной щелчок) исполняемые скрипты из Finder :

  • Исполняемые скрипты [1] с суффиксом NO или суффиксом.command :
    • которые выполняются по умолчанию - не требуется установка :
      • новый терминал откроется окно , в котором сценарий работает.
      • по умолчанию окно останется открытым после завершения сценария, чтобы вы могли проверить вывод (хотя в этот момент оболочка, запустившая сценарий, завершилась, и вы больше не можете взаимодействовать с ней ).
        Однако через терминал Preferences... > Profilesвы можете автоматически закрыть окно при выходе из скрипта.
    • Оговорка : рабочая папка является неизменно текущего пользователя домашней папки , НЕ папка , в которой скрипт находится.
      • Чтобы изменить сценарий оболочки на папку, в которой он находится, поместите
        • cd -- "$(dirname "$BASH_SOURCE")" сразу после линии Шебанга
        • или, если вы должны оставаться POSIX-совместимыми, cd -- "$(dirname "$0")".
        • Для крайних случаев, таких как поиск истинного исходного каталога сценария с символической ссылкой , смотрите мой ответ .
    • Если скрипт неожиданно не исполняется :
      • Сделайте его исполняемым, запустив chmod +x <script>в Терминале; в противном случае вы увидите следующие симптомы:
      • .command: Finder отображает вводящее в заблуждение сообщение об ошибке, которое предполагает, что проблема может быть исправлена ​​с помощью File > Get Info, что не соответствует действительности - используйте chmod +xметод, предложенный выше.
      • без суффикса:
        • с линией Шебанга (например, #!/bin/bash): поведение такое, как если бы суффикс был .sh- см. ниже.
        • с не притон линии: открывается в текстовом редакторе по умолчанию (который TextEdit по умолчанию).
  • Скрипты с суффиксом.sh , исполняемые или нет:
    • которые открыты для редактирования в TextEdit.appили, если он установлен, с Xcode.app.
  • Скрипты с суффиксом.scpt или .applescript(даже если они сами помечены как исполняемые, что обычно не так):
    • открыт для редактирования в[Apple]Script Editor
    • Обратите внимание, что файлы исходного кода JXA, похоже, не имеют четкого суффикса (пока).
  • Сценарии с более пользовательским суффиксом (суффикс еще не известен системой), то ли исполняемым файлом или нет (на самом деле, относится к любому файлу):
    • подскажите вам за приложениечтобы открыть их , когда вы первый открыть их , и помните , что выбор .

[1] Исполняемый означает: сценарий с установленными битами разрешений на исполняемый файл и вызывающим пользователем - относительно владельца файла - следовательно, потенциально может быть исполнен.
Если вы используете chmod a+xдля установки всех битов разрешений (что является типичным), любой может вызвать его (при условии, что им также разрешено читать файл на основе битов разрешений на чтение и владельца файла).

mklement0
источник
1
Когда закроется скрипт, можно закрыть открытое окно терминала, просто osascriptвключив его в .commandфайл вместо того, чтобы вручную связываться с профилем.
l'L'л
@ I'L'I: Вы имеете в виду добавление osascript -e '...'команды в конец сценария? Что это за конкретная команда, и гарантирует ли она, что правая вкладка закрыта, даже если скрипт не запущен на самой передней вкладке?
mklement0
5
@ mklement0: Да, я не тестировал его более нескольких минут, но основная идея заключается в том, чтобы включить в последнюю строку сценария .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Это может не сработать в каждом сценарии, хотя перенаправление на end - это действительно ключ - в противном случае osascript можно легко адаптировать (например, окно может потребоваться изменить на tab, если это поведение вашего терминала по умолчанию и т. д.).
l'L'л
Можно ли не позволить окну / вкладке терминала закрыть после .commandзапуска файла скрипта, несмотря на настройки профиля?
CyberMew
@CyberMew: если вы можете изменить скрипт, добавьте команду, которая ждет нажатия клавиши в конце; например, если это bashскрипт, добавьте read -p 'Press Return to close this window.'в качестве последнего утверждения.
mklement0
38

Кроме того, вы можете создать обычное приложение Mac OS X из своего скрипта с помощью Platypus

svth
источник
Это действительно отличное приложение. Но у меня есть некоторые проблемы здесь. У меня есть сценарий Python, который я хочу преобразовать в файл .app. Мой сценарий содержит строку, в которой пользователь должен ввести какой-то ввод (raw_input ()), когда .app достигает этой строки кода, он выдает ошибку EOF (конец файла). Что я могу с этим поделать?
1
Это не интерактивный терминал. Утконос просто представляет вывод сценария. Там нет двунаправленной связи.
svth
4
Или создайте приложение OS X с Automator, используя действие Run Shell Script.
Ранги Кин
15

Самый простой способ - изменить расширение на .command или без расширения.

Но это откроет Терминал, и вам придется его закрыть. Если вы не хотите видеть вывод, вы можете использовать Automator для создания приложения Mac, которое вы можете дважды щелкнуть, добавить в док и т. Д.

  1. Открытое Automatorприложение
  2. Выберите тип приложения
  3. Введите «запустить» в поле поиска действий
  4. Дважды щелкните «Run Shell Script»
  5. Нажмите Runкнопку в правом верхнем углу, чтобы проверить это.
  6. File > Save создать приложение.

введите описание изображения здесь

wisbucky
источник
Большой ! Как мы можем автоматизировать этот рабочий процесс для ежедневного запуска в 13:00?
Иакшай
9

Нет необходимости использовать сторонние приложения, такие как Platypus.

Просто создайте Apple Script с помощью Script Editor и используйте команду do shell script "shell commands"для прямых вызовов команд или исполняемых файлов сценариев оболочки, сохраните редактируемый файл сценария где-нибудь в безопасности и экспортируйте его для создания сценария приложения. Сценарий приложения запускается двойным щелчком или выбором в папке бара.

Люк-Оливье
источник
3
Более того, используйте Automator и используйте действие Run Shell Script напрямую, а не через Apple Script.
Ранги Кин
0

Вы также можете установить значения по умолчанию по расширению файла, используя RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

потенциально вы можете настроить .sh для открытия в iTerm / Terminal и т. д., для этого потребуются разрешения пользователя на выполнение, например,

chmod u+x filename.sh

Предварительная панель RCDefaultApp

Tomachi
источник
0

chmod 774 filename

Примечание : файл с именем 'filename', имеющий скрипт bash, не имеет расширения

Нео
источник