Jak napisać skrypt, aby otworzyć wiele kart terminali i wykonać w nich kod?

8

Chcę mieć możliwość otwarcia aplikacji terminalowej i automatycznego uruchamiania skryptu, który otwiera kilka kart, i uruchamiania w każdym z nich dowolnego zestawu poleceń. Na przykład chciałbym otworzyć jedną kartę, zmienić katalogi i uruchomić serwer Railsowy; mieć inne otwarte, zmieniać katalogi i ogonować plik dziennika; itp..

Czy można to zrobić za pomocą skryptu powłoki lub skryptu jabłka?

Znalazłem to pytanie, ale wydaje się, że zawiesza się, jeśli chcę otworzyć karty z poleceniami, które się nie kończą (np. Uruchamianie serwera Rails).

Andrew Hubbs
źródło

Odpowiedzi:

5

Jest to trochę zuchwałe, ale można to osiągnąć w AppleScript. Jeśli istnieje określona z góry liczba zakładek i wstępnie ustawione polecenia, które chcesz uruchomić, nie jest to trudne.

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

Oczywiście zamień na firstCommanddowolne polecenie, które faktycznie chcesz uruchomić i tak dalej. Z jakiegokolwiek powodu Terminal naprawdę nie ma dostępnego sposobu na tworzenie nowych zakładek za pomocą AppleScript, więc długa, chropowata linia pośrodku po prostu mówi Terminalowi, aby napisał, Taby otworzyć tę nową kartę, a następnie uruchomią się w niej nowe polecenia.

Możesz uruchomić ten AppleScript w obecnej postaci lub użyć go w Automatorze, aby utworzyć nową usługę, którą możesz następnie uruchomić z dowolnego miejsca za pomocą skrótu klawiaturowego, jeśli chcesz.

Dodatki - Jeśli chcesz zwolnić trochę skryptu / polecenia w nowo otwartej sesji terminala, można odnieść to

Itai Ferber
źródło
2

Oto skrypt powłoki, który zrobi to, co chcesz - zarówno dla terminala Apple, jak i iTerm (mamy użytkowników obu).

W przypadku kart, które otworzysz, spowoduje to wykonanie innego pliku wsadowego na każdej karcie, takiego jak jeden dla tomcat, jeden dla ciebie db itp.

#!/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
źródło
1

Ponieważ otwieranie nowej karty jest tak trywialne, sugeruję, aby wykonywanie poleceń było tak trywialne, jak to możliwe, i robienie tego w staromodny sposób.

Wywołałeś dwa konkretne działania, więc popracujmy nad nimi. Zauważ, że zamierzam przyjmować wiele założeń opartych na tym, co wiem o Railsach, ale niekoniecznie specyficznych dla twojego projektu.

Krótko mówiąc, alias polecenia, aby zrobić to, co chcesz, lub utwórz prosty skrypt powłoki, aby zrobić to, co chcesz.

Utwórz skrypt powłoki o nazwie myapp.startz zawartością:

#!/bin/bash

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

Prawdopodobnie będziesz musiał utworzyć plik o nazwie .bash_profile w swoim katalogu domowym lub zmodyfikować plik już istniejący i dodać wiersz podobny;

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

Następnie utwórz katalog bin w folderze domowym i przenieś do niego skrypt myapp.start. Upewnij się także, że właściciel ma bit wykonania przynajmniej ( chmod 700 myapp.start).

Następnie otwórz Terminal.app, wpisz myapp.starti masz uruchomione szyny. Możesz też wpisać, myaa następnie nacisnąć Tabi pozwolić autouzupełnianiu wypełnić resztę, nacisnąć return. Boom, serwer działa.

Według rozszerzenia możesz już zrozumieć, jak zrobić ogon pliku dziennika, ale i tak będę kontynuować. Utwórz inny plik w ~ / bin o nazwie myapp.taillog z zawartością:

#!/bin/bash

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

Ponownie, umieść go w folderze bin chmod 700 ~/bin/myapp.taillog, a następnie po uruchomieniu, a następnie serwer Rails, szybko naciśnij t, wpisz myapp.taillogi masz wydrukowany plik dziennika.

Dwa polecenia, dwa dodatkowe naciśnięcia klawiszy (otwieranie kart), może to wystarczy?

Są tutaj dwie bardzo oczywiste ulepszenia. Jednym z nich jest napisanie funkcji powłoki zdolnej do „odkrywania” nazw aplikacji railsowych, więc nie musisz pisać skryptu powłoki dla każdej z nich, napisanie pod-komendy zaprojektowanej do uruchomienia webbricka / wybranego serwera railsowego, i komendy do rutynowego wykonywania kilku kluczowych plików dziennika.

Drugie ulepszenie polega na tym, że prawdopodobnie możesz napisać AppleScript, który wykonuje niezbędną interakcję z terminalem i odpowiednie wykonywanie poleceń w każdym z nich. Ale szczerze mówiąc, ssę AppleScript i cały dzień pracuję w kodzie bash i perl, więc oferuję porady dotyczące moich umiejętności :).

Jason Salaz
źródło
1

Chociaż możesz być związany z terminalem Apple w oparciu o treść pytania, iTerm jest lepszy od domyślnego emulatora terminala do skryptowania i zarządzania wieloma oknami.

Koncepcja zakładek pozwala na łatwe zarządzanie zestawem okien. Skrypty iTerm przy użyciu AppleScript / Automater są prostsze, wydajniejsze i lepiej udokumentowane na stronie internetowej programisty . (w porównaniu do terminala)

Sprawdź to, jeśli skrypty normalnego terminala nie spełniają twoich potrzeb. Zdecydowanie polecam także dostosowanie powłoki uniksowej do ustawienia aliasów dla często używanych poleceń. Użyjesz ich w skryptach początkowych zadań dla nowych okien, ale także za każdym razem, gdy jesteś w powłoce i musisz zmienić zadania zamiast otwierać nowe okno.

bmike
źródło
1

Skrypty są fajne, ale możesz także użyć Automatora, aby nagrać „Watch Me Do”, w którym otwierasz Terminal, i wrzucić kilka Command + N dla preferowanej liczby okien. Zrobione.

David Metcalfe
źródło
1

Istnieje świetna odpowiedź na bardzo podobne pytanie na StackOverflow, ale prawdopodobnie należy już tutaj, więc po prostu skopiuję / z makaronem tutaj.


Jest to absolutnie możliwe, ale zajmie to trochę pracy z twojej strony. Pierwszą rzeczą, której potrzebujesz, jest skonfigurowanie każdego okna / karty, którą chcesz w Ustawieniach.

Mam 4 zakładki, które otwieram automatycznie przy każdym otwarciu terminalu. DB Shell, Editor, Server, I Shell. Wszystkie są w ramach projektu Sasquatch(nie pytaj), a więc nazewnictwa. Każde z nich powinno mieć następnie przypisane unikalne polecenie.

W tym przypadku wykonuję vim. Jeśli masz konkretny katalog, w którym chcesz zacząć, możesz użyć czegoś takiego vim ~/projects/main/. Naprawdę, cokolwiek chcesz tam wejść, to polecenie, które powłoka wykona po otwarciu. Teraz musisz otworzyć wszystkie okna / karty:

  1. Zamknij wszystko.
  2. Otwórz nowe okno dla każdego ze swoich profili.
    • Przejdź do Shellmenu => New Tab/ New Window=> Wybierz profil, który utworzyłeś powyżej.
    • Powtórz dla każdego okna lub karty, którą chcesz.
  3. Po otwarciu wszystkich okien i / lub kart zapisz je jako grupę okien.
    • Przejdź do Windowmenu => Save Window As Group....
    • Nadaj nazwę grupie okien (jest to pomocne później).
    • Jeśli chcesz, aby ta grupa była otwierana za każdym razem, gdy otwierasz Terminal, zaznacz pole u dołu tego ekranu, a następnie naciśnij Zapisz.
  4. Zamknij wszystkie swoje Windows / Tab (czas na przetestowanie!).
  5. Otwórz nową grupę okien.
    • Przejdź do Windowmenu => Open Window Group=> Wybierz właśnie utworzoną grupę.

Powinno to wyświetlić wszystkie okna, które właśnie miałeś, w tej samej pozycji. Każde z skonfigurowanych poleceń Settingspowinno zostać uruchomione w odpowiednich zakładkach.

Jack M.
źródło
1
Tylko uwaga, linki do obrazów Imageshack w twojej odpowiedzi wydają się być zepsute.
beporter
Niestety nie mam zdjęć ani starego pliku ustawień, aby go ponownie utworzyć. = - [
Jack M.