Як я можу написати сценарій для відкриття декількох вкладок терміналів та виконання коду в них?


8

Я хочу мати можливість відкрити термінальну програму і мати її або автоматично запустити скрипт, який відкриває кілька вкладок і виконувати довільний набір команд у кожній. Наприклад, я хотів би, щоб одна вкладка відкривалась, змінювала каталоги та запускала сервер рейлів; мати ще один відкритий, змінити каталоги та передати файл журналу; тощо.

Чи є спосіб це зробити або зі скриптом оболонки, або з яблучним сценарієм?

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

Відповіді:


5

Це трохи хакі, але ви можете досягти цього в AppleScript. Якщо є заздалегідь задана кількість вкладок, які ви хочете запустити, і задані команди, які ви хочете запустити, це не складно.

tell application "Terminal"
    -- Activate it.
    activate

    set targetWindow to 0

    -- Get a window that's not busy.
    -- If there are no open windows, open one.
    if count of windows is greater than 0 then
        repeat with currentWindow in windows
            if currentWindow is not busy then
                set targetWindow to currentWindow
            end if
        end repeat
    else
        do script ""
        set targetWindow to window 1
    end if

    -- Do command 1.
    set firstCommand to "cd ~/Desktop; clear"
    do script firstCommand in targetWindow

    -- Open a new tab.
    tell application "System Events" to tell process "Terminal" to keystroke "t" using command down

    if count of windows is greater than 0 then
        repeat with currentWindow in windows
            if currentWindow is not busy then
                set targetWindow to currentWindow
            end if
        end repeat
    else
        do script ""
        set targetWindow to window 1
    end if

    -- Do command 2.
    set secondCommand to "cd /Applications; clear"
    do script secondCommand in targetWindow

    -- And so on...
end tell

Звичайно, замініть firstCommandна ту команду, яку ви насправді хочете виконати, тощо. З будь-якої причини Термінал насправді не має доступного способу створення нових вкладок через AppleScript, тому довга, хитра лінія в середині просто каже Терміналу ввести, Tщоб відкрити цю нову вкладку, а потім нові команди виконуватимуться в ній.

Ви можете запустити цей AppleScript так, як є, або використовувати його в Automator для створення нової послуги, яку ви можете виконувати з будь-якого місця, використовуючи комбінацію клавіш, якщо хочете.

Додаткові елементи - Якщо ви хочете запустити певний скрипт / команду в нещодавно відкритому сеансі терміналу, ви можете посилатися на це


2

Ось сценарій оболонки, який буде робити те, що ви хочете - як для терміналу Apple, або для iTerm (у нас є обидва).

Для ваших вкладок, які ви відкриєте, це виконає ще один пакетний файл у кожній вкладці, наприклад, один для tomcat, один для db тощо.

#!/bin/bash

function tab () {
    local cmd=""
    local cdto="$PWD"
    local args="$@"

    if [ -d "$1" ]; then
        cdto=`cd "$1"; pwd`
        args="${@:2}"
    fi

    if [ -n "$args" ]; then
        cmd="; $args"
    fi

    if [ $TERM_PROGRAM = "Apple_Terminal" ]; then
        osascript 
            -e "tell application \"Terminal\"" \
                -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
                -e "do script \"cd $cdto; clear $cmd\" in front window" \
            -e "end tell"
            > /dev/null
    elif [ $TERM_PROGRAM = "iTerm.app" ]; then
        osascript
            -e "tell application \"iTerm\"" \
                -e "tell current terminal" \
                    -e "launch session \"Default Session\"" \
                    -e "tell the last session" \
                        -e "write text \"cd \"$cdto\"$cmd\"" \
                    -e "end tell" \
                -e "end tell" \
            -e "end tell" \
            > /dev/null
    fi
}

tab path_to_script1 sh script1
tab path_to_script2 sh script2
tab path_to_script3 sh script3

1

Оскільки відкрити нову вкладку настільки тривіально, я б запропонував зробити виконання ваших команд максимально тривіальним, і зробити це старомодно.

Ви назвали дві конкретні дії, тож давайте попрацюємо з цими. Зауважте, що я буду робити багато припущень, виходячи з того, що я знаю про Rails, але не обов'язково конкретно для вашого проекту.

Щоб скоротити довгу історію, псевдонім - команда робити те, що ви теж хочете, або створити тривіальний сценарій оболонки, щоб робити те, що ви хочете.

Створіть сценарій оболонки myapp.startз назвою:

#!/bin/bash

cd Development/rails/myapp
# Do any common environment initializations here, such as RAILS_ENV=development
script/server

Вам, ймовірно, доведеться також створити файл з іменем .bash_profile у вашій домашній директорії або змінити вже існуючий та додати рядок типу;

export PATH="$HOME/bin:${PATH}"

Потім створіть каталог бін у своїй домашній папці та перемістіть у неї сценарій myapp.start. Переконайтесь, що у нього власник виконує біт як мінімум ( chmod 700 myapp.start).

Потім відкрийте Terminal.app, введіть myapp.startі у вас запущені рейки. Крім того, введіть myaпотім натисніть Tab, і нехай автозаповнення заповнить решту, натисніть return. Бум, сервер працює.

За розширенням ви вже можете зрозуміти, як зробити хвостовий файл журналу, але я продовжуватиму все одно. Створіть інший файл у ~ / bin з назвою myapp.taillog із вмістом:

#!/bin/bash

tail -F ~/Development/rails/myapp/logs/development.log

Знову помістіть його у папку bin, chmod 700 ~/bin/myapp.taillogпісля запуску потім рельсовий сервер, швидко натисніть t, наберіть myapp.taillog, і у вас буде надрукований файл журналу.

Дві команди, дві додаткові клавіші (відкриття вкладок), можливо, цього достатньо?

Тут є два дуже очевидних удосконалення. Перша полягає в тому, щоб написати функцію оболонки, здатну "відкривати" назви додатків рейок, тому вам не доведеться писати сценарій оболонки для кожного, написання підкоманди, призначеної для запуску веб-веб-сервера / вашого рейкового сервера, і команди для хвоста - регулярно проводячи кілька ключових файлів журналу.

Друге вдосконалення полягає в тому, що цілком ймовірно, що ви можете написати AppleScript, який виконує необхідну термінальну взаємодію та відповідне виконання команд всередині кожного. Але, відверто кажучи, я весь час всмоктую AppleScript і працюю над bash кодом та кодом perl, тому пропоную поради, що стосуються мого набору навичок :).


1

Хоча ви можете бути прив’язані до терміналу Apple, виходячи з формулювання вашого питання, iTerm перевершує емулятор терміналу за замовчуванням для створення сценаріїв та керування кількома вікнами.

Концепція закладок дозволяє легко керувати набором вікон. Сценарій iTerm за допомогою AppleScript / Automater простіший, потужніший і краще задокументований на веб-сайті розробника . (порівняно з терміналом)

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


1

Сценарії приємні і всі, але ви також можете просто використовувати Automator, щоб записати "Watch Me Do", де ви відкриєте термінал, і киньте декілька команд + N у вибране число вікон. Et voila.


1

На StackOverflow є чудова відповідь на дуже подібне запитання , але воно, ймовірно, належить тут вже зараз, тому я просто скопіюйте / вставити його сюди.


Це абсолютно можливо, але це займе певну роботу з вашого боку. Перше, що вам потрібно - це налаштувати кожне вікно / вкладку, яке ви хочете, у своїх налаштуваннях.

У мене є 4 вкладки, які я автоматично відкриваю кожен раз, коли відкриваю термінал. DB Shell, Editor, Server, І Shell. Це все в рамках проекту Sasquatch(не запитувати), таким чином, іменування. Кожен з них повинен мати унікальну команду, пов'язану з ними.

У цьому випадку я виконую vim. Якщо у вас є конкретний каталог, з якого ви хочете почати, ви можете використовувати щось подібне vim ~/projects/main/. Дійсно все, що ви хочете зайти, є команда, яку оболонка буде виконувати, коли вона відкриється. Тепер вам потрібно відкрити всі ваші вікна / вкладки:

  1. Закрийте все.
  2. Відкрийте нове вікно для кожного свого профілю.
    • Перейдіть до Shellменю => New Tab/ New Window=> Виберіть профіль, який ви створили вище.
    • Повторіть для кожного потрібного вікна або вкладки.
  3. Після відкриття всіх вікон та / або вкладок збережіть їх як групу вікон.
    • Перейдіть до Windowменю => Save Window As Group....
    • Дайте назву своїй групі вікон (це стане в нагоді пізніше).
    • Якщо ви хочете, щоб ця група відкривалася щоразу, коли ви відкриваєте термінал, поставте прапорець у нижній частині цього екрана та натисніть кнопку Зберегти.
  4. Закрийте всі ваші Windows / вкладки (час тестувати!).
  5. Відкрийте нову групу вікон.
    • Перейдіть до Windowменю => Open Window Group=> Виберіть групу, яку ви щойно створили.

Це повинно спливати всі вікна, які ви тільки що мали, у тому самому положенні. Кожну з команд, яку ви налаштували, Settingsслід запустити на відповідних вкладках.


1
Лише зауваження, посилання на зображення Imageshack у вашій відповіді, здається, порушені.
beporter

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