Como posso escrever um script para abrir várias guias do terminal e executar o código nelas?

8

Quero poder abrir o aplicativo de terminal e fazer com que ele execute automaticamente um script que abra várias guias e execute um conjunto arbitrário de comandos em cada uma. Por exemplo, eu gostaria que uma guia fosse aberta, alterasse diretórios e executasse um servidor rails; abrir outro, alterar diretórios e ajustar um arquivo de log; etc ..

Existe uma maneira de fazer isso com um script de shell ou um script de maçã?

Eu encontrei essa pergunta, mas parece travar se eu quiser abrir abas com comandos que não terminam (como executar o servidor rails).

Andrew Hubbs
fonte

Respostas:

5

Isso é um pouco hacky, mas você pode conseguir isso no AppleScript. Se você deseja um número predeterminado de guias e comandos predefinidos que deseja executar, isso não é difícil.

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

Obviamente, substitua firstCommandpelo comando que você realmente deseja executar e assim por diante. Por qualquer motivo, o Terminal não tem realmente uma maneira acessível de criar novas guias por meio do AppleScript; portanto, a longa linha com aparência de hacker no meio diz ao Terminal para digitar Tpara abrir essa nova guia e, em seguida, novos comandos serão executados nela.

Você pode executar este AppleScript como está ou usá-lo no Automator para criar um novo serviço, que você pode executar de qualquer lugar usando um atalho de teclado, se desejar.

Extras - Se você quiser disparar algum script / comando na sessão de terminal recém-inaugurado, você pode consultar este

Itai Ferber
fonte
2

Aqui está um script de shell que fará o que você deseja - para o Terminal da Apple ou o iTerm (temos usuários de ambos).

Para as guias que você abrir, isso executará outro arquivo em lote em cada guia, como um para o tomcat, um para o banco de dados, etc.

#!/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
fonte
1

Como é tão trivial abrir uma nova guia, sugiro tornar a execução de seus comandos o mais trivial possível e fazer isso da maneira antiga.

Você chamou duas ações específicas, então vamos trabalhar com elas. Note que vou fazer muitas suposições com base no que sei do Rails, mas não necessariamente específico para o seu projeto.

Para encurtar a história, alias um comando para fazer o que você também deseja, ou crie um shell script trivial para fazer o que você deseja.

Crie um script de shell chamado myapp.start, com o conteúdo:

#!/bin/bash

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

Você provavelmente também precisará criar um arquivo chamado .bash_profile em seu diretório pessoal ou modificar um já existente e adicionar uma linha como;

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

Em seguida, crie um diretório bin na sua pasta pessoal e mova o script myapp.start para ele. Verifique também se o proprietário executa o bit no mínimo ( chmod 700 myapp.start).

Em seguida, abra o Terminal.app, digite myapp.starte você tem os trilhos em execução. Como alternativa, digite myae pressione Tabe deixe o preenchimento automático preencher o restante, pressione return. Boom, servidor em execução.

Por extensão, você já deve entender como fazer uma cauda de arquivo de log, mas continuarei assim mesmo. Crie outro arquivo em ~ / bin chamado myapp.taillog, com o conteúdo:

#!/bin/bash

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

Novamente, coloque-o na pasta bin e chmod 700 ~/bin/myapp.taillog, depois de iniciar, em seguida, rails server, pressione rapidamente t, digite myapp.tailloge você terá um arquivo de log sendo impresso.

Dois comandos, duas chaves adicionais (abrir as guias), talvez isso seja suficiente?

Existem duas melhorias muito óbvias aqui. Uma é escrever uma função de shell capaz de "descobrir" os nomes dos aplicativos rails, para que você não precise escrever um script de shell para cada um, escrever um subcomando projetado para iniciar o webbrick / seu servidor de rails preferido e comandos para cauda -F'ing alguns arquivos de log chave rotineiramente.

A segunda melhoria é que é provável que você possa escrever um AppleScript que faça a interação necessária com o terminal e a execução apropriada de comandos dentro de cada um. Mas, francamente, eu sou péssima em AppleScript e trabalho com código bash e código perl o dia todo, por isso estou oferecendo conselhos relevantes ao meu conjunto de habilidades :)

Jason Salaz
fonte
1

Embora você possa estar vinculado ao terminal da Apple com base na redação da sua pergunta, o iTerm é superior ao emulador de terminal padrão para criar scripts e gerenciar várias janelas.

O conceito de favoritos permite o gerenciamento fácil de um conjunto de janelas. O script do iTerm usando AppleScript / Automater é mais simples, mais poderoso e melhor documentado no site do desenvolvedor . (comparado ao terminal)

Verifique se você acha que o script do terminal normal não atende às suas necessidades. Eu também recomendo que você procure personalizar seu shell unix para configurar aliases para comandos usados ​​com freqüência. Você os usará no script de tarefas iniciais para novas janelas, mas também sempre que estiver em um shell e precisar alternar tarefas, em vez de precisar abrir uma nova janela.

bmike
fonte
1

Os scripts são legais e tudo, mas você também pode usar o Automator para gravar um 'Watch Me Do' onde você abre o Terminal e acionar alguns Command + Ns para o seu número preferido de janelas. Et voila.

David Metcalfe
fonte
1

Há uma ótima resposta para uma pergunta muito semelhante ao StackOverflow, mas provavelmente pertence aqui agora, então vou copiá-lo / colar aqui.


Isso é absolutamente possível, mas será necessário algum trabalho de sua parte. A primeira coisa que você precisa é configurar cada janela / guia que você deseja em suas configurações.

Eu tenho quatro abas que abro automagicamente toda vez que abro o Terminal. DB Shell, Editor, Server, E Shell. Estes estão todos dentro do projeto Sasquatch(não pergunte), portanto, a nomeação. Cada um deles deve ter um comando exclusivo associado a eles.

Neste caso, estou executando vim. Se você tiver um diretório específico em que deseja iniciar, poderá usar algo como vim ~/projects/main/. Realmente, o que quer que você queira acessar, é o comando que o shell executará quando for aberto. Agora você precisa abrir todas as suas janelas / guias:

  1. Feche tudo.
  2. Abra uma nova janela para cada um dos seus perfis.
    • Vá para o Shellmenu => New Tab/ New Window=> Selecione o perfil que você criou acima.
    • Repita para cada janela ou guia que você deseja.
  3. Depois de abrir todas as janelas e / ou guias, salve-as como um grupo de janelas.
    • Vá para o Windowmenu => Save Window As Group....
    • Dê um nome ao seu grupo de janelas (isso será útil mais tarde).
    • Se você deseja que esse grupo seja aberto sempre que abrir o Terminal, marque a caixa na parte inferior desta tela e pressione Salvar.
  4. Feche todas as suas janelas / guias (hora de testá-lo!).
  5. Abra seu novo grupo de janelas.
    • Vá para o Windowmenu => Open Window Group=> Selecione o grupo que você acabou de criar .

Isso deve abrir todas as janelas que você tinha na mesma posição. Cada um dos comandos que você configurou Settingsdeve ser iniciado em suas respectivas guias.

Jack M.
fonte
11
Apenas uma observação: os links da imagem Imageshack na sua resposta parecem estar quebrados.
beporter
Infelizmente não tenho as imagens nem o arquivo de configurações antigo para recriá-lo. = - [
Jack M.