Como executar o xfce-terminal com diferentes comandos por guia e continuar usando as guias após o retorno dos comandos?

20

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

-H (espera) parece significar que o terminal não está fechado após o término, mas como finalizo esse processo voluntariamente? De modo nenhum? De tal maneira que eu possa continuar usando o terminal.

Estou usando o xubuntu com xfce4-terminal e bash. Existe uma solução GUI melhor para inicializar 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 saída, que você não deseja misturar no mesmo terminal. E, às vezes, eles precisam ser interrompidos com ^ C e reiniciados. 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 apenas navega para os diretórios desejados e abre todas as guias na ordem correta para encontrá-las sempre na mesma posição, nomeando cada guia para sua finalidade:

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

Eclipse e 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, ele funciona, pois é o último comando da lista.

Usuário desconhecido
fonte
Sua pergunta ainda não está clara para mim. Deseja que um terminal volte ao shell assim que o comando com o qual foi iniciado termina? Algo como xterm -e 'stuff;bash'?
Frostschutz 25/05
11
Esta questão ainda precisa de trabalho! Encontrei este tópico, acho que é isso que o OP está procurando: Como manter o xfce4-terminal aberto? . Ele quer saber como acessar uma guia na qual a opção "-H" foi usada e continuar a usá-la como uma janela normal do terminal. OP, você pode confirmar se estou correto?
slm
@slm: Sim, eu gosto de manter o terminal aberto para processar outros comandos - eu só gosto de iniciar o primeiro dos meus comandos automaticamente e ter várias guias nomeadas.
usuário desconhecido

Respostas:

21

A -H/-holdopção é manter a janela do emulador de terminal aberta quando os aplicativos iniciados nela (shell ou outro) forem encerrados. Nesse estado, nada mais pode acontecer.

Se você deseja 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 de forma interativa após a saída do aplicativo, com bash, você pode fazer uso da $PROMPT_COMMANDvariável de ambiente para xfce-terminaliniciar 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 trabalhos desse shell, o que significa que você pode suspendê-los Ctrl-Ze continuar com eles mais tarde fg/bgcomo se os tivesse inserido no prompt desse shell interativo.

No entanto, isso pressupõe que você não define o $PROMPT_COMMANDseu ~/.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 digitado no prompt do shell, você pode até adicioná-lo à lista de histórico. Gostar:

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

Dessa forma, depois de sair vi, você pode pressionar a Uptecla para recuperar o mesmo vicomando.

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"'

solução, como indicado em outras respostas, funciona, mas tem algumas desvantagens:

  1. Se você pressionar Ctrl-Cenquanto cmdestiver em execução, isso eliminará o externo, shpois há apenas um grupo de processos para ambos she cmd.
  2. Você não pode usar Ctrl-Zpara suspendercmd
  3. Como na $PROMPT_COMMANDabordagem, o status de saída do comando não estará disponível no $?.

Você pode solucionar o problema acima 1 fazendo o seguinte:

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

Ou:

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

Com esse último, você também poderá suspender o processo Ctrl-Z, mas não poderá usá fg/bg-lo. Você vai ser capaz de continuá-la no fundo embora fazendo uma kill -s CONTna pid de cmd.

Stéphane Chazelas
fonte
Uau. Isso é bastante complicado, mas parece funcionar. :) Não sei por que a recompensa desapareceu. Infelizmente eu não tinha tempo para testar as dicas.
usuário desconhecido
Eu realmente não entendo todas as regras do sistema de recompensas. Como acho que você merece a recompensa, reinicio uma nova recompensa.
usuário desconhecido
Sim, as recompensas expiram após 7 dias e você tem 24 horas depois para concedê-las. Se você não os perceber, eles serão atribuídos a qualquer usuário com o representante mais alto (2 ou superior). Aqui está mais do que você sempre quis saber sobre bounties 8-): meta.stackexchange.com/questions/16065/...
SLM
11
@AdrianLopez, nos bashscripts, não há histórico, pois não há edição de linha ou interação do usuário, a menos que você o utilize read -e(e você verá que isso history -s textfunciona para preparar o histórico visto por ele read -e). Aqui, não estamos executando a history -spartir de um script, mas a partir do $PROMPT_COMMANDgancho de um shell interativo.
Stéphane Chazelas
11
@ StéphaneChazelas Amazing. Seguindo sua outra resposta valiosa aqui , devo acrescentar que xfce4-terminal, pelo menos a versão 0.6.3 agora deseja um parâmetro extra - --disable-server- para passar pelo ambiente. Ref: lists.debian.org/debian-user/2017/10/msg00045.html .
ジョージ
5

Pelo que entendi sua pergunta, você deseja executar alguns processos em um terminal, podendo Ctrl+ + Ce, depois disso, manter a janela aberta, com o shell.

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

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"
Rafael Cavalcanti
fonte
Funciona com várias guias?
usuário desconhecido
@userunknown Claro. Apenas adicione --tab antes dos outros comandos. Por exemplo, se você quiser executar "ls / etc" e "ls / dev", você poderá emitir: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Se você usa o Gnome Terminal, você deve escrever --tab também antes do primeiro comando.
Rafael Cavalcanti
Isso é um pouco útil, embora não tanto quanto eu esperava. Quando inicio o gradle com `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle explodedWar explodedWarSync; bash' "` uma guia é aberta, com o nome mas mostra "gradle: comando não encontrado "ao digitar o comando, funciona bem. Git, mysql e scala funcionam bem dessa maneira, mas para o jboss, Ctrl-C termina a guia jboss inteira. Eu só poderia preparar o shell começando por aí - talvez repetindo o comando de entrada. Eu realmente não entendo o que está fazendo as diferenças aqui.
usuário desconhecido
1

vários aplicativos em xfce4-terminalguias

Adicionando um shell interativo a cada guia do xfce

Você pode usar esse hack para adicionar um shell se / quando você tiver Ctrl+Cuma guia:

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

Isso fornecerá o seguinte:

   ss do xfce com abas

   ss do xfce com Ctrl + C superior

slm
fonte
0

Ao sair do shell sem -Ho terminal, também será fechado. Com esta bandeira, o terminal continuará em execução, mas o processo do shell está fechado e não pode ser revivido.

Eu acho que você está tentando arquivar que você acabou de iniciar seu terminal e 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ê apenas inicia seu shell:

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

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

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

krissi
fonte
Isso não funciona porque gradle e jboss estão produzindo permanentemente uma saída. Você não gosta que eles misturem sua produção. O banco de dados e o terminal scala são interativos. Não faz sentido colocá-los em segundo plano. A idéia de abrir outros comandos em guias diferentes é que o histórico seja preenchido apenas com poucos comandos diferentes para um tópico e, portanto, navegue rapidamente.
usuário desconhecido