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

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

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

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

Ответы (6)

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

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

Вот сценарий оболочки, который будет делать то, что вы хотите — как для терминала 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

Поскольку открыть новую вкладку так тривиально, я бы посоветовал сделать выполнение ваших команд как можно более тривиальным и делать это по старинке.

Вы назвали два конкретных действия, так что давайте работать с ними. Обратите внимание, что я собираюсь сделать много предположений, основанных на том, что я знаю о 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, быстро нажмите t, введите myapp.taillog, и у вас будет напечатан файл журнала.

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

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

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

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

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

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

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

На 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должна запускаться на соответствующих вкладках.

Просто примечание: ссылки на изображения Imageshack в вашем ответе кажутся неработающими.
К сожалению, у меня нет ни изображений, ни старого файла настроек, чтобы воссоздать его. знак равно