Как я могу написать скрипт для открытия нескольких вкладок терминала и выполнения кода в них?

8

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

Есть ли способ сделать это с помощью сценария оболочки или appleScript?

Я нашел этот вопрос, но он зависает, если я хочу открыть вкладки с командами, которые не заканчиваются (например, запуск сервера rails).

Эндрю Хаббс
источник

Ответы:

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любой командой, которую вы действительно хотите выполнить, и так далее. По какой-то причине у Terminal действительно нет доступного способа создания новых вкладок с помощью AppleScript, поэтому длинная, взволнованная линия в середине просто говорит Terminal печатать, Tчтобы открыть эту новую вкладку, и тогда в ней будут выполняться новые команды.

Вы можете запустить этот AppleScript как есть или использовать его в Automator для создания новой службы, которую затем можно запустить из любого места, используя сочетание клавиш, если хотите.

Дополнения - Если вы хотите запустить какой-либо скрипт / команду во вновь открытом терминальном сеансе, вы можете обратиться к этому

Итай Фербер
источник
2

Вот сценарий оболочки, который будет делать то, что вы хотите - для терминала Apple или iTerm (у нас есть пользователи обоих).

Для ваших вкладок, которые вы открываете, будет выполняться другой пакетный файл на каждой вкладке, например, один для tomcat, один для вас дБ и т. Д.

#!/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
bbezanson
источник
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}"

Затем создайте каталог bin в своей домашней папке и переместите в него скрипт 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, затем после запуска, затем rails server, быстро нажмите t, введите myapp.taillog, и у вас будет файл журнала, который будет напечатан.

Две команды, два дополнительных нажатия клавиш (открытие вкладок), возможно, этого достаточно?

Здесь есть два очень очевидных улучшения. Одним из них является написание функции оболочки, способной «обнаруживать» имена приложений rails, так что вам не нужно писать сценарий оболочки для каждого, писать подкоманду, предназначенную для запуска webbrick / вашего сервера rails, и Команды для хвоста -F'а несколько ключевых файлов журнала.

Второе улучшение заключается в том, что вы, вероятно, могли бы написать AppleScript, который выполняет необходимое взаимодействие с терминалом и обеспечивает соответствующее выполнение команд внутри каждого. Но, честно говоря, я сосу AppleScript и целый день работаю над bash-кодом и perl-кодом, поэтому я даю советы, относящиеся к моему набору навыков :).

Джейсон Салаз
источник
1

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

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

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

bmike
источник
1

Сценарии хороши и все, но вы также можете просто использовать Automator, чтобы записать «Watch Me Do», где вы открываете терминал, и добавьте несколько Command + N для предпочитаемого количества окон. И вуаля.

Дэвид Меткалф
источник
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. Закройте все ваши окна / вкладки (пора проверить!).
  5. Откройте новую группу окон.
    • Зайдите в Windowменю => Open Window Group=> Выберите группу, которую вы только что создали.

Это должно выскочить все окна, которые вы только что имели, в той же позиции. Каждая из команд, которые вы настраиваете, Settingsдолжна запускаться на соответствующих вкладках.

Джек М.
источник
1
Просто обратите внимание, что ссылки на изображения из Imageshack в вашем ответе не работают.
beporter
К сожалению, у меня нет ни изображений, ни старого файла настроек для его повторного создания. = - [
Джек М.