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 found
e rails s
cria um novo aplicativo rails em vez de iniciar o servidor rails, estou usando .rmvrc para selecionar um gemset assim que essa pasta for acessada .
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.tab=" --tab-with-profile=Default"
??Respostas:
Eu recomendaria usar
tmux
comtmuxinator
, ele fará o trabalho para você, e você também pode confiar emterminator
layouts!Para
terminator
a resposta do mhnagaoka do checkout do layout, aqui também pergunte ao Ubuntu:fonte
Para resumir algumas das outras respostas e seus comentários, eis o que acabei com:
Observe que tirei a guia 'mestre', os perfis e os títulos (que parecem estar obsoletos
gnome-terminal
).fonte
$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)
Tente o seguinte:
caso contrário, toda a expressão após -e será interpretada como o comando.
Para incluir aliases de .bashrc, use em
-ic
vez dec
fonte
bash: rails c: command not found
e '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 scriptrails c
um terminal sem mais nada? Talvez devesse serrails -c
?rvm list gemsets
e ele dizNo command 'rvm' found
.. execute o mesmo comandorvm list gemsets
na 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?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 écommand
e, 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.fonte
options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )
emoptions+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )
e ele me deu o mesmo erro .. estou fazendo certo?