Como criar um script que abra as janelas do terminal e execute comandos nelas?

140

Eu tenho três scripts que preciso executar quando inicio minha máquina Ubuntu, eles iniciam os serviços que eu uso no meu ambiente de desenvolvimento.

Para fazer isso, abro manualmente três terminais e digito os comandos.

Existe alguma maneira de criar um script que abra três terminais e execute um comando em cada um deles? (Cada comando deve estar em uma janela de terminal separada para que eu possa ver a saída deles).

JSBach
fonte

Respostas:

138
gnome-terminal -e command

ou

xterm -e command

ou

konsole -e command

Bastante

terminal -e command

Para fazer com que o terminal permaneça quando o comando sair:

No konsole há uma --noclosebandeira.

No xterm, há uma -holdbandeira.

Em gnome-terminal, vá para Editar -> Preferências do perfil -> Título . Clique na guia comando . Selecione Segure o terminal no menu suspenso chamado Quando o comando sair . Você deve criar um novo perfil para isso e executar com

Comando gnome-terminal --window-with-profile = NAMEOFTHEPROFILE -e
nickguletskii
fonte
1
Se eu tentar segurar o terminal, eu recebo "processo filho saiu normalmente com código de status 127"
Darshan Chaudhary
2
O gnome-terminal não tem mais a opção de título :(
törzsmókus
1
@ törzsmókus é 2017 de fato! Os lançamentos LTS têm uma vida útil de 5 anos. O 14.04 não termina até abril de 2019. wiki.ubuntu.com/Releases
bhass1 5/17/17
1
gnome-terminal -e commandsó funciona se commandfor citado. Então, isso não funciona: gnome-terminal -e "echo hello world; sleep 3"mas isso faz: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Suspiro.
bgoodr
3
Você também pode manter o terminal gnome aberto, adicionando ; $SHELLao final do comando. Ex:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples
58

Em vez de codificar gnome-terminal, konsoleetc., use o sistema Alternatives. O programa que executa o emulador de terminal padrão é:

x-terminal-emulator

No meu sistema, ele abre uma nova instância do Konsole toda vez que eu executo esse comando.

Felizmente, os terminais parecem suportar a -eopção de executar um comando (eu verifiquei para konsolee gnome-terminal). Os argumentos após o comando são passados ​​para o comando invocado. O Bash se recusa a permanecer aberto no meu terminal, é necessário um script adicional para obter um terminal:

#!/bin/sh
"$@"
exec "$SHELL"

Se você salvou o script anterior /home/user/hackye o tornou executável, execute seus scripts com:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

O caminho completo é necessário e /home/user/hackydeve ser executável.

Minha tentativa anterior de executar um script em uma nova janela de terminal pode ser encontrada na revisão 2 , foi antes de eu perceber que os argumentos podem ser passados ​​para x-terminal-emulator.

Lekensteyn
fonte
Nesse caso, não ajudará muito, pois o solicitante deseja fazer algo que não é o mesmo para todos os terminais.
nickguletskii
Tentativa 3: este deve manter o terminal aberto e executar o programa com argumentos opcionais.
Lekensteyn
1
Eu usei a opção gnome, no entanto, depois de executar meu script, o terminal principal se fecha !! .. alguma idéia do porquê?
21315 McLan
3
@ Suda.nese Isso ocorre por design, quando o "terminal" terminar de executar o script, ele será encerrado porque não há mais nada a fazer. Você pode "consertar" isso invocando um shell onde você pode executar comandos ( bash) ou ter uma linha como read -p "Press Return to continue".
Lekensteyn
1
Como você pode executar mais de um comando no terminal? Por exemplo cd xxx && start.sh. O intérprete vê o && como a segunda parte do comando (o que é lógico), mas, se eu citar, ele tenta executar a coisa toda como um grande argumento.
Richard
9

Muito simples-

#!/bin/bash

/etc/init.d/ccpd status

Isso é suficiente para outros comandos que não precisam exibir nada no terminal. Mas aqui é preciso ver o status exibido.
Então, ele precisa rodar em uma janela de terminal

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

A outra postagem pretendia []ser um espaço reservado

Aqui "NAMEOFTHEPROFILE" deve ser substituído pelo nome do perfil que "Mantém o terminal quando o comando sai".

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Karthik T
fonte
1
@cipricus eu acredito []era apenas espaço reservado
Karthik T
Entendi. mas eu tenho que fazer o terminal para não fechar tão rápido. eu acho que é também na questão ligada
@cipricus você tentou o perfil um? Só precisa adicionar --window-with-profile=NAMEOFTHEPROFILEao que eu dei
Karthik T
1
@cipricus Eu precisaria voltar para casa para dar instruções melhores, mas a idéia é criar um perfil especial com esse conjunto de opções e usar o nome do perfil especial no local acima.
precisa saber é o seguinte
2
@cipricus se isso é suficiente para você, então está tudo bem. O perfil nada mais é do que um grupo de configurações. Você pode definir SOMENTE as configurações para uso em seu script e não precisa usá-lo em todos os terminais. Você pode ver Editar -> Perfis para ver todos os perfis que você possui, e você adicionaria um lá, que foi configurado conforme explicado no post que você vinculou #
Karthik T
5

Ajudado pela resposta de @ nickguletskii , e meu próprio comentário sob a resposta dele, e inspirado no voto positivo de @ grabantot do meu comentário, aqui está minha maneira preferida de fazê-lo, especialmente quando eu quero que o terminal fique aberto para que eu possa usá-lo manualmente.

Ex. uso: isso é realmente útil para adicionar aos seus programas de inicialização, para que este script seja executado, abra um terminal, crie e nomeie uma guia no terminal e execute um comando para você. Ou você pode simplesmente adicionar um link simbólico para esse script na área de trabalho. Uso esse tipo de abordagem para clicar duas vezes em um único ícone na área de trabalho e abrir vários terminais (com várias guias nomeadas de acordo com o trabalho que vou fazer neles) e programas para configurar meu ambiente de programação, por exemplo, para o trabalho diário.

Aqui está um exemplo artificial, que abre uma única guia, intitula-a "test" e executa o comando simples cd /etc; lsdentro dela. A $SHELLparte no final força o shell a permanecer aberto para que você possa ver sua saída e continuar usando (eu aprendi isso em outro lugar no Stack Overflow):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Aqui está um exemplo mais complicado que abre três abas separadas no mesmo terminal gnome. Este é exatamente o tipo de coisa que meu atalho na área de trabalho faz para que eu possa abrir várias janelas de programação de uma só vez:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Aqui está um detalhamento desse comando acima:

  • gnome-terminal = abrir um terminal gnomo
  • --tab = abra uma guia exclusiva para o que vem a seguir
  • --title="tab 1" = intitule esta guia "guia 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= executa o bash -c 'cd /etc; ls; $SHELL'comando, que é um comando que acabei de criar como exemplo; aqui está o que ele faz:
    • bash -c diz que é um comando bash '
    • cd /etc = 'alterar' o diretório no caminho "/ etc"
    • ls = 'l'i''t conteúdo deste diretório
    • $SHELL= esse boato enigmático é necessário para manter o shell aberto para que você possa trabalhar com ele. Se você deseja que o shell seja aberto, execute seu comando e feche, basta remover esta parte. No entanto, quero que a guia fique aberta para que eu possa tornar a programação mágica. :)
  • em seguida, recomeçamos a --tabpeça para produzir a guia 2 e, novamente, a guia 3. Personalize com o conteúdo do seu coração.

Captura de tela:

insira a descrição da imagem aqui

Gabriel Staples
fonte
1
feliz por ter sido útil) Também tenho scripts nos quais posso clicar e começar a trabalhar no projeto. Havia dois problemas com eles: muitas janelas de terminal (tinham uma tela inteira separada para elas) e janelas fechadas após a falha do servidor, por exemplo. Essa resposta resolve meus dois problemas com --tab + $ SHELL. Agradável
grabantot
1

comentando a resposta de Lekensteyn. Eu sei que este é um post antigo, mas para quem acha isso útil (como eu acabei de fazer) Em vez de criar outro "script hacky", basta colocar uma função dentro do script que você está chamando

hacky_function()
{
"$@"
exec "$SHELL"
}

Chame seu script com "argumentos opcionais x-terminal-emulator -e / path / to / script hacky_function aqui"

Não se esqueça de colocar "$ @" no final do script

Sruli
fonte
-2

Use o comando screen e -d desanexe de uma sessão de tela existente e reconecte aqui -m force uma nova sessão de tela -S crie uma sessão nomeada em vez de usar o nome padrão

Jack Heath
fonte
esta resposta não é de todo claro, por favor cuidado para tornar mais compreensível
azerafati
@azerafati fato, a tela não abrir qualquer janela de terminal ... nem sequer é pretendido por esse pacote incrível ...
erm3nda