Abrindo várias guias de terminal e executando o comando

9

Preciso abrir várias guias do terminal, atribuir-lhes títulos, acessar um diretório e fazer com que cada guia execute um comando.

Eu sou novo no Linux e em scripts de shell. Após pesquisar online e verificar algumas soluções, criei este script ( EDITADO com base nas respostas abaixo):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Ele abre as guias, nomeia-as, mas falha ao executar os comandos que geram este erro:

Ocorreu um erro ao criar o processo filho para este terminal

Outra falha é que, se eu interromper o comando em execução, ele fechará a guia, o que eu não quero. Eu preciso ser capaz de parar o comando e executá-lo novamente na mesma guia.

O que há de errado com o script? Existe outra maneira mais simples de fazer isso?

Nota: Se eu removi a parte (-e "\" bash -c $ {cmds [i]}; bash \ "") do comando, ela abre as guias no diretório especificado e nomeia-as, sem erros.

-Edit-1:

Depois de aplicar a resposta do @Tuknutx abaixo e editar o script, o erro não aparece mais, mas ele me fornece bash: rails c: command not founde rails scria um novo aplicativo rails em vez de iniciar o servidor rails, estou usando .rmvrc para selecionar um gemset assim que essa pasta for acessada .

Brary
fonte
Se você deseja executar o script na inicialização do ubuntu: - você pode executar o script como um serviço inicial ( help.ubuntu.com/community/UbuntuBootupHowto ) ou: usando "aplicativos de inicialização" no ambiente de área de trabalho
Aboelnour
se eu escrever cmds[1]="'ping 192.168.9.9'", me dá o mesmo erro, mas resolvi removendo a citação única. Então, se eu escrever, cmds[1]="ping 192.168.9.9"funciona.
24516 daisy
@Brary, mas não entendo por que ele abre três guias, uma padrão e outras duas que são definidas no script. Porque nós definimos tab=" --tab-with-profile=Default"??
24516 daisy

Respostas:

3

Eu recomendaria usar tmuxcom tmuxinator, ele fará o trabalho para você, e você também pode confiar em terminatorlayouts!

Para terminatora resposta do mhnagaoka do checkout do layout, aqui também pergunte ao Ubuntu:

  1. Após configurar seu layout, clique com o botão direito do mouse em qualquer plano de fundo do terminal e escolha Preferências → guia Layouts e clique no botão Adicionar .

  2. Dê um nome a ele e pressione Fechar .

  3. Isso deve criar o ~/.config/terminator/configarquivo mencionado .

  4. Agora você pode iniciar o terminator usando o layout salvo usando: terminator -l yourLayout(substitua yourLayout pelo que você escolher na etapa 2).

  5. (opcional) Edite o ~/.config/terminator/configarquivo para que, onde estiver escrito [layouts]e aninhado abaixo dele [[yourLayout]], renomeie yourLayout para o padrão e remova / renomeie o layout padrão anterior . Agora, quando o Terminator for iniciado sem nenhum parâmetro, ele carregará seu [[default]]layout personalizado !

Islam Azab
fonte
2

Para resumir algumas das outras respostas e seus comentários, eis o que acabei com:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Observe que tirei a guia 'mestre', os perfis e os títulos (que parecem estar obsoletos gnome-terminal).

Ian Hincks
fonte
A saída de $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.`Use“ - ”para finalizar as opções e coloque a linha de comando para executar após ela. . that's an output but the comands get executed. When i use $ tab - `o comando não é executado e o terminal dsisplays:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee 2/19/19
1

Tente o seguinte:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

caso contrário, toda a expressão após -e será interpretada como o comando.

Para incluir aliases de .bashrc, use em -icvez dec

TuKsn
fonte
O erro não aparece mais, obrigado. Mas isso me dá bash: rails c: command not founde 'rails s' cria um novo aplicativo de rails em vez de iniciar o servidor de rails. Isso muda o escopo da pergunta, vou editá-lo com sua modificação para o script
Brary
Funcionou se você tentar rails cum terminal sem mais nada? Talvez devesse ser rails -c?
TuKsn
Tentei que não funcionou. Eu até tentei rvm list gemsetse ele diz No command 'rvm' found.. execute o mesmo comando rvm list gemsetsna primeira guia que se abre sem executar um comando e funcionou! ele executa o comando antes que o ambiente seja carregado e o arquivo .rvmrc seja carregado?
Brary
1

O argumento que você está dando à opção -e "bash -c command; bash"inclui as aspas. Ele interpreta toda essa cadeia como o nome de um comando! Tente isto em vez disso: -e "bash -c 'command ; bash'". Dessa forma, o que é executado na janela do terminal é commande, depois disso, você recebe um shell filha, que eu assumo é o que você deseja. Aliás, você também pode dizer 'command & bash'; isso executará o comando em segundo plano e fornecerá o shell filha imediatamente.

Silvio Levy
fonte
Eu mudei este options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )em options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )e ele me deu o mesmo erro .. estou fazendo certo?
Brary
Não está correto: remova \ "antes da primeira festança e \" após o 'depois da segunda festança.
Silvio Levy
Obrigado, editei a pergunta e alterei o escopo para incluir trilhos e rvm.
Brary