Como executar o xfce-terminal com comandos diferentes por aba e continuar usando as abas depois que os comandos retornarem?

19

Para manter a visão geral eu gosto de colocar vários comandos sempre na mesma ordem e iniciá-los automaticamente juntos (gradle, git, banco de dados, scala-REPL, jboss ...)

-H (espera) parece significar que o terminal não está fechado após o término, mas como eu termino esse processo intencionalmente? De modo nenhum? De tal forma que eu possa continuar a usar o terminal.

Estou usando o xubuntu com o xfce4-terminal e o bash. Existe uma solução GUI melhor para iniciar vários comandos, com a capacidade de continuar trabalhando nessa janela / guia?

Atualização: Se você não conhece estes comandos: Jboss e gradle estão produzindo continuamente a saída, que você não quer ter misturada no mesmo terminal. E às vezes eles precisam ser interrompidos com ^ C e reiniciados. Eu não gosto de reabrir um termo xfce4 e navegar para o diretório em que preciso atuar.

O banco de dados e o scala-REPL são interativos, portanto não faz sentido iniciá-los em segundo plano.

Meu script de inicialização atual simplesmente navega para os diretórios desejados e abre todas as guias na ordem correta para encontrá-las sempre na mesma posição, nomeando todas as guias para seu propósito:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
    --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
    --tab -T bash       --working-directory=/home/stefan/oximity \
    --tab -T gradle     --working-directory=/home/stefan/oximity/med \
    --tab -T git        --working-directory=/home/stefan/oximity/med \
    --tab -T mysql      --working-directory=/opt/mini/mysql \
    --tab -T jboss      --working-directory=/opt/mini/jboss \
    --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
    --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

O Eclipse e o arandr são desanexados do shell e executados em sua própria janela, portanto, o parâmetro -e (execute) funciona. Eu acho que para o scala-REPL funciona, pois é o último comando da lista.

    
por user unknown 15.05.2013 / 12:13

4 respostas

19

A opção -H/-hold é manter o emulador de terminal aberto quando os aplicativos iniciados nele (shell ou outro) forem encerrados. Nesse estado, nada mais pode acontecer.

Se você quiser iniciar um comando como um trabalho de um shell interativo no emulador de terminal xfce4-terminal e manter o shell em execução e usá-lo interativamente após o encerramento do aplicativo, com bash , você poderá fazer uso do Variável de ambiente $PROMPT_COMMAND , para que xfce-terminal inicie um shell interativo que inicia o comando fornecido logo antes do primeiro prompt.

xfce4-terminal \
  -T eclipse \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
  \
  --tab -T arandr \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
  \
  --tab -T bash \
  --working-directory=/home/stefan/oximity \
  ...

Dessa forma, os comandos são jobs desse shell, o que significa que você pode suspendê-los com Ctrl-Z e retomá-los mais tarde com fg/bg como se tivesse entrado -los no prompt desse shell interativo.

Isso pressupõe que você não defina o $PROMPT_COMMAND no seu ~/.bashrc . Observe também que o status de saída do comando não estará disponível em $? .

Para torná-lo ainda mais parecido com o comando que foi inserido no prompt do shell, você pode até adicioná-lo à lista do histórico. Como:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
  unset PROMPT_COMMAND
  history -s vi\ /etc/motd
  vi /etc/motd" bash'

Dessa forma, uma vez que você sair do vi , você pode pressionar a tecla Up para recuperar o mesmo comando vi .

Uma maneira mais fácil de escrever:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
  xfce4-terminal --disable-server \
          -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
    --tab -T       top -e 'env CMD=top bash'

O:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

A solução dada em outras respostas funciona, mas tem algumas desvantagens:

  1. Se você pressionar Ctrl-C enquanto cmd estiver em execução, isso eliminará o% externosh, pois há apenas um grupo de processos para sh e cmd .
  2. Você não pode usar Ctrl-Z para suspender cmd
  3. Como na abordagem $PROMPT_COMMAND , o status de saída do comando não estará disponível em $? .

Você pode contornar 1 acima fazendo:

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

Ou:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

Com este último, você também poderá suspender o processo com Ctrl-Z , mas não poderá usar fg/bg nele. Você poderá continuar em segundo plano fazendo um kill -s CONT no pid de cmd .

    
por 29.05.2013 / 21:53
5
Até onde eu entendi sua pergunta, você quer rodar alguns processos em um terminal, sendo capaz de Ctrl + C e, depois disso, manter a janela aberto, com o shell.

Se eu estiver certo, isso pode ser feito com um comando como este:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"
    
por 26.05.2013 / 10:20
1

vários aplicativos em xfce4-terminal guias

Adicionando um shell interativo a cada guia xfce

Você pode usar este hack para adicionar um shell se / quando você Ctrl + C uma aba:

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

Isso lhe dará o seguinte:

    
por 24.05.2013 / 10:51
0

Ao sair do shell sem -H , o terminal também será fechado. Com este sinalizador, o terminal continuará funcionando, mas o processo do shell é fechado e não pode ser reativado.

Acho que você está tentando confirmar que acabou de iniciar seu terminal e que seu ambiente de desenvolvimento é iniciado?

Você pode criar um script de shell e colocar todos os seus comandos dentro dele. No final do script, você inicia seu shell:

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

Em seguida, chame esse script via xfce4-terminal -e /the/script . Ao sair de $SHELL , o processo pai (seu script) foi concluído e as tarefas em segundo plano receberão o sinal de saída e também serão encerradas.

Se você quiser mantê-los vivos, use, por exemplo, nohup jboss & no seu script

    
por 24.05.2013 / 10:55