Запустити скрипт оболонки на OS X без появи вікна терміналу?


23

Я намагаюся налаштувати кілька комбінацій клавіш, які відкривають конкретні сесії iTerm, які мені вдалося зробити з BetterTouchTool та трохи магії AppleScript. Проблема полягає в тому, що OS X наполягає на тому, щоб відкрити вікно терміналу для будь-якого сценарію оболонки, який ви виконуєте через графічний інтерфейс (тобто з Finder, або як ярлик клавіатури від BetterTouchTool). Вікно терміналу не з’являється, якщо я запускаю скрипт безпосередньо з іншого терміналу.

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

Я також спробував призначити додаток Terminal на інший віртуальний робочий стіл у налаштуваннях Spaces, щоб спробувати перемістити його з поля зору, але потім він спочатку перейде на цей робочий стіл перед запуском сценарію.

Чи є спосіб повністю відключити цю поведінку? Я вже знайшов налаштування в налаштуваннях терміналу, щоб закрити вікно після закінчення сценарію, але все ще дратує те, що вікно терміналу спливе на секунду.


Вибачте, я не зовсім розумію. Що ви хочете зробити з цими скриптами оболонки? Ви хочете відкрити iTerm через скрипт оболонки? Ви ексклюзивно говорите про Terminal.app чи змішуєте iTerm із "Terminal" у своєму запитанні? Не могли б ви опублікувати приклад того, що ви намагаєтеся запустити?
slhck

Я налаштував кілька сеансів iTerm для запуску звичайної оболонки, відкриття консолі Rails, відображення журналу Rails тощо. Виключно я використовую iTerm, і Terminal автоматично відкривається OS X з будь-якої дурної причини. Але в будь-якому випадку я знайшов рішення зробити так, щоб підхід до групи працював належним чином (див. Відредаговане запитання).
toupeira

Я бачу! Що ж, було б дивним, якби ви могли відповісти на власне запитання (скориставшись кнопкою внизу) і сказати нам, що ви зробили, або як ви вирішили проблему. Можливо, опублікуйте кілька прикладів у своєму запитанні, а потім просто додайте коротку відповідь. Таким чином, якщо хтось натрапить на ваш пост, він може щось навчитися з нього!
slhck

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

1
Я все ще розгублений. Ви не хочете запускати їх через .app, створений Automator?
slhck

Відповіді:


21

Відкрийте Automator , оберіть програму Application , додайте сценарій Run Shell Script і введіть команду Shell між цитатами (якщо у вас є файл, ви можете просто перетягнути його).

Окрім відтворення, тепер ви можете зберегти його (як додаток у будь-якому місці) і навіть встановити значок .


Я спробував запустити команду таким чином із повноекранного додатка, проте він завжди відкривав її у фоновому режимі. Мені довелося перетворити команду в оболонці без блокування, додавши a, &а потім зателефонувавши AppleScript, щоб перенести додаток (у моєму випадку mplayer) на фронт: mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
Ленар Хойт

Класний хак @mcb. Але я не розумію чому. Зазвичай ми хочемо приховати вікно терміналу, оскільки воно відкриє інше вікно, яке є основним. Якщо вам потрібно перше вікно терміналу mplayer, я вважаю, що воно не відкриває ще одне, і чому б ви хотіли його ховати в першу чергу?
Крего

Я використовую mplayerдля відтворення відео з слайд-шоу (у Skim). Існує помилка, що програвач залишається у фоновому режимі, якщо Skim встановлений на повноекранний екран, я не впевнений, чи пов’язана ця помилка лише зі Skim або всіма додатками на повноекранному екрані, тому я зрозумів, що опублікую тут своє рішення.
Ленар Хойт

6

Ось швидкий і брудний приклад майже без зусиль (для програми під назвою "myapp"):

  1. Складіть часткову ієрархію програм:

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. Переконайтесь, що перший рядок сценарію має повний шлях до потрібної програми, наприклад,

    #!/bin/bash
    
  3. Назвіть свій скрипт оболонки "myapp" (без лапок, без розширень), дайте йому дозволи на виконання, а потім помістіть його в підкаталог MacOS. Щоб дати йому виконувати дозволи:

    chmod ugo+x myapp
    
  4. Перейдіть у підкаталог Contents та створіть файл PkgInfo, що містить рядок: APPL ???? [немає термінатора рядка в кінці рядка!] Використовуйте утиліту cat (1) для створення файлу:

    cat > PkgInfo
    APPL????
    

    Після того, як ви набрали рядок (не натискайте return!), Введіть два контрольних D, які закриють
    файл без термінального рядка та повернуть вас до запиту оболонки.)

  5. Двічі клацніть на новій «програмі» у пошуку. Вона працюватиме без вікна.


Не працювало 10.13.6, повідомлення про помилку говорить "Ви не можете відкрити програму" LoginSessionTimeLimit.app ", оскільки вона не підтримується на цьому типі Mac."
Дуглас Холд

1
Чи працював у Мохаве (10.14.3) для мене. Мені дуже сподобався такий підхід. Спасибі.
loco.loop

Працював для мене 10.13.6. @Douglas Held спробуйте запустити свій скрипт "вручну", тобто з терміналу. Ймовірно, він виходить з помилки / помилки, отже, він не працює для вас ...
натхненний

Чудово! Випробуваний, працюючи в Мохаве 10.14.6
Нікола Мінґотті

4

Ви можете перевірити Platypus , який створює програми Mac OS X із скриптів оболонки та інших інтерпретованих сценаріїв.


3

Ось невеличке вирішення, на випадок, якщо вам потрібні пускові програми, такі як Альфред . Я використовую його щодня, і я купив Powerpack , який дозволяє запускати безшумні сценарії оболонки.

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

Вони не відкриють термінал під час запуску і можуть бути прив'язані до будь-якої послідовності ключових слів. Вони навіть можуть включати параметри та мати додаткові параметри:

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

Я використовую це для невеликих фрагментів, і він дуже гнучкий.



1

Якщо ви додасте ключ LSUIElementі встановите його 1у Info.plistсвоєму додатку, він не створить значок у Dock.

Ось Info.plistмій маленький додаток сценарію оболонки:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>

Дякую, але це, здається, не має ефекту. Я також спробував touchвиконати пакет, щоб переконатися, що використовується найновіша версія. Але все одно, мені не дуже подобається підхід до групи, тому що, здається, завжди буде створюватися окремий екземпляр програми
toupeira

Для мене дотик також не допоміг (я намагався вимкнути LSUIElement), є якийсь інший тип кешування, але компресія та вилучення програми допомогли. Чому ви не любите підхід до комплекту? Також ви можете використовувати applescript і просто запустити do shell script "say 'arsti'", це не відкриє вікно терміналу.
тиг

Гаразд, виявляється, я просто ідіот ;-) Я не зміг знайти надійний спосіб перевірити, чи програма вже працює з AppleScript, тому я використав звичайний скрипт bash, який дзвонить pgrep, а потім передає відповідний код безпосередньо osascript(інтерпретатор AppleScript). Проблема в тому, що pgrepприйшла з домашньої мови та не за замовчуванням $PATH. Тож мій сценарій завжди запускав новий екземпляр iTerm, навіть якщо він вже запущений. Після додавання повного шляху до pgrepсценарію підхід до
пакетних програм,

Поєднуючи цю відповідь з відповіддю від @JeffB, наведеною вище, та зі спрощеною версією Info.plist @ tig (я вилучив клавіші CFBundleExecutableта і CFBundleIconFileключі), я змусив це працювати прекрасно.
Дейв Ленд

0

Ось трохи вирішення:

Складіть яблучний сценарій, який викликає сценарій оболонки :)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

osacompileБуде компілювати 'do shell script "XXX"'AppleScript фрагмент коду. Ваш сценарій оболонки - це XXX.

Слідкуйте за цитуванням, сценарій оболонки повинен бути котирований належним чином, щоб пройти оболонку, яку ви використовуєте для компіляції.

Але це можна запустити від BetterTouchTool без будь-якої хиткості.


0

Є й інша можлива тренування. Захистіть свій скрипт оболонки в робочому процесі автоматизатора. Викликайте робочий процес із запуском. Код такий:

/usr/bin/automator /path/to/the/file.workflow

Це не запустить жодну програму і не з’явиться в меню меню, і це буде більш тихо, ніж додаток Platypus.

Ще кращий спосіб виконання скриптів оболонки - це безпосередньо при запуску.

/bin/bash /path/to/shellScript.command

буде виконувати команду ультра мовчки на задньому плані.

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