Come eseguire xfce-terminal con diversi comandi per scheda e continuare a utilizzare le schede dopo che i comandi sono tornati?


20

Per mantenere la visione d'insieme mi piace posizionare più comandi sempre nello stesso ordine e avviarli automaticamente insieme (gradle, git, database, scala-REPL, jboss ...)

-H (tieni premuto) sembra significare che il terminale non è chiuso dopo la chiusura, ma come posso terminare un tale processo intenzionalmente? Affatto? In modo tale da poter continuare a utilizzare il terminale.

Sto usando xubuntu con con xfce4-terminal e bash. Esiste una soluzione GUI migliore per avviare più comandi, con la possibilità di continuare a lavorare in quella finestra / scheda?

Aggiornamento: se non si conoscono questi comandi: Jboss e Gradle producono continuamente output, che non si desidera avere mescolato nello stesso terminale. E a volte devono essere interrotti con ^ C e riavviati. Non mi piace riaprire un termine xfce4 e navigare nella directory in cui devo agire.

Database e scala-REPL sono interattivi, quindi non ha senso avviarli in background.

Il mio attuale script di avvio passa alle directory desiderate e apre tutte le schede nell'ordine giusto per trovarle sempre nella stessa posizione, denominando ogni scheda per il suo scopo:

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 vengono staccati dalla shell ed eseguiti nella propria finestra, quindi il parametro -e (esegui) funziona. Penso che per lo scala-REPL funzioni poiché è l'ultimo comando dell'elenco.


La tua domanda non è ancora chiara per me. Volete che un terminale ritorni alla shell una volta terminato il comando con cui è stato avviato? Qualcosa del genere xterm -e 'stuff;bash'?
frostschutz,

1
Questa domanda ha ancora bisogno di lavoro! Ho trovato questo thread, penso che questo sia ciò che l'OP sta cercando: come mantenere aperto xfce4-terminal? . Vuole sapere come accedere a una scheda in cui è stato utilizzato l'interruttore "-H" e continuare a usarlo come una normale finestra terminale. OP, puoi confermare se sono corretto?
slm

@slm: Sì, mi piace tenere aperto il terminale per elaborare ulteriori comandi - Mi piace solo avviare automaticamente il primo dei miei comandi e avere più schede denominate.
utente sconosciuto

Risposte:


21

L' -H/-holdopzione è di mantenere aperta la finestra dell'emulatore di terminale una volta terminate le applicazioni avviate (shell o altro). In quello stato, non può succedere altro.

Se si desidera avviare un comando come lavoro di una shell interattiva nell'emulatore di terminale xfce4-terminal e mantenere la shell in esecuzione e utilizzarla in modo interattivo dopo la chiusura dell'applicazione, con bash, è possibile utilizzare la $PROMPT_COMMANDvariabile di ambiente, per xfce-terminaliniziare una shell interattiva che avvia il comando dato appena prima del primo 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 \
  ...

In questo modo, i comandi sono lavori di quella shell, il che significa che è possibile sospenderli Ctrl-Ze riprenderli in un secondo momento fg/bgcome se fossero stati immessi al prompt di quella shell interattiva.

Ciò presuppone però che tu non abbia impostato il $PROMPT_COMMANDtuo ~/.bashrc. Si noti inoltre che lo stato di uscita del comando non sarà disponibile in $?.

Per renderlo ancora più simile al comando immesso al prompt della shell, è anche possibile aggiungerlo all'elenco cronologico. Piace:

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

In questo modo, una volta usciti vi, è possibile premere il Uptasto per richiamare lo stesso vicomando.

Un modo più semplice per scriverlo:

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'

Il:

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

la soluzione fornita in altre risposte funziona ma presenta alcuni svantaggi:

  1. Se premi Ctrl-Cmentre cmdè in esecuzione, questo uccide l'esterno shpoiché esiste un solo gruppo di processi per entrambi she cmd.
  2. Non puoi usare Ctrl-Zper sospenderecmd
  3. Come $PROMPT_COMMANDnell'approccio, lo stato di uscita del comando non sarà disponibile in $?.

Puoi aggirare 1 sopra facendo:

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

O:

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

Con quest'ultimo, sarai anche in grado di sospendere il processo Ctrl-Z, ma non potrai usarlo fg/bg. Sarete in grado di continuare in fondo anche se facendo una kill -s CONTsul pid di cmd.


Wow. È piuttosto complicato, ma sembra funzionare. :) Non so perché la ricompensa sia svanita. Sfortunatamente non avevo tempo prima di testare i suggerimenti.
utente sconosciuto

Non capisco davvero tutte le regole del sistema di taglie. Dal momento che penso che tu meriti la taglia, ricomincio una nuova taglia.
utente sconosciuto

Sì, i doni scadono dopo 7 giorni e hai 24 ore dopo per assegnarli. Se non li conosci, vengono assegnati a qualsiasi utente abbia il rappresentante più alto (2 o superiore). Ecco più di quanto tu abbia mai desiderato sapere sulle taglie Cool
slm

1
@AdrianLopez, negli bashscript, non esiste alcuna cronologia in quanto non esiste alcuna modifica della riga o interazione dell'utente a meno che non venga utilizzata read -enello script (e vedrai che history -s textfunziona lì per innescare la cronologia vista da quello read -e). Qui, non stiamo eseguendo history -sda uno script, ma dal $PROMPT_COMMANDgancio di una shell interattiva.
Stéphane Chazelas,

1
@ StéphaneChazelas Incredibile. Seguendo qui un'altra tua preziosa risposta , devo aggiungere che xfce4-terminalalmeno la versione 0.6.3 ora vuole un parametro aggiuntivo - --disable-server- per passare attraverso l'ambiente. Rif: lists.debian.org/debian-user/2017/10/msg00045.html .
ジ ョ ー ジ

5

Per quanto ho capito la tua domanda, vuoi eseguire alcuni processi in un terminale, poterli Ctrl+ Ce, successivamente, tenere aperta la finestra, con la shell.

Se ho ragione, questo potrebbe essere realizzato con un comando come questo:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"

Funziona con più schede?
utente sconosciuto

@userunknown Sicuro. Aggiungi --tab prima degli altri comandi. Ad esempio, se si desidera eseguire "ls / etc" e "ls / dev", si dovrebbe emettere: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Se usi Gnome Terminal, devi scrivere --tab anche prima del primo comando.
Rafael Cavalcanti,

Questo è un po 'utile, anche se non quanto speravo. Quando inizio il gradle con `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle explodedWar explodedWarSync; bash' "` viene aperta una scheda, denominata ma mostra "gradle: comando non trovato "durante l'immissione del comando funziona correttamente. Git, mysql e scala funzionano bene in questo modo, ma per jboss, Ctrl-C termina l'intera scheda jboss. Potrei solo preparare la shell a partire da lì - forse facendo eco al comando da inserire. Non capisco davvero cosa stia facendo le differenze qui.
utente sconosciuto

1

più app nelle xfce4-terminalschede

Aggiunta di una shell interattiva a ciascuna scheda xfce

Puoi usare questo trucco per aggiungere una shell se / quando hai Ctrl+Cuna scheda:

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

Questo ti darà quanto segue:

   ss di xfce w / tabs

   ss di xfce w / top Ctrl + C


0

All'uscita dalla shell anche -Hil terminale verrà chiuso. Con questo flag il terminale continuerà a funzionare, ma il processo di shell è chiuso e non può essere ripristinato.

Penso che tu stia cercando di archiviare il fatto che hai appena avviato il tuo terminale e il tuo ambiente di sviluppo si avvia?

È possibile creare uno script di shell e inserirvi tutti i comandi. Alla fine dello script hai appena avviato la shell:

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

Quindi chiama questo script tramite xfce4-terminal -e /the/script . Quando si esce dal $SHELLprocesso principale (lo script) è terminato e anche le attività in background riceveranno il segnale di uscita e si chiuderanno.

Se vuoi mantenerli in vita, usa ad esempio nohup jboss &nella tua sceneggiatura


Non funziona perché gradle e jboss producono in modo permanente output. Non ti piace farli confondere il loro output. Il database e lo scala-terminale sono interattivi. Non ha senso metterli in secondo piano. L'idea di aprire altri comandi in diverse schede è che la cronologia è riempita con pochi comandi diversi su un argomento e quindi navigabile rapidamente.
utente sconosciuto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.