Wie führe ich xfce-terminal mit verschiedenen Befehlen pro Tab aus und benutze die Tabs weiter, nachdem die Befehle zurückgekehrt sind?

20

Um den Überblick zu behalten platziere ich gerne mehrere Befehle immer in der gleichen Reihenfolge und starte sie automatisch zusammen (gradle, git, database, scala-REPL, jboss ...)

-H (hold) scheint zu bedeuten, dass das Terminal nach dem Beenden nicht geschlossen wird, aber wie kann ich einen solchen Prozess absichtlich beenden? Keineswegs? So, dass ich das Terminal weiter nutzen kann.

Ich benutze xubuntu mit xfce4-terminal und bash. Gibt es eine bessere GUI-Lösung, um mehrere Befehle zu starten und in diesem Fenster / dieser Registerkarte weiterarbeiten zu können?

Update: Wenn Sie diese Befehle nicht kennen: Jboss und gradle produzieren kontinuierlich Ausgaben, die Sie nicht im selben Terminal mischen möchten. Und manchmal müssen sie mit ^ C unterbrochen und neu gestartet werden. Ich öffne nicht gerne einen xfce4-Begriff erneut und navigiere zu dem Verzeichnis, in dem ich handeln muss.

Datenbank und scala-REPL sind interaktiv, daher macht es keinen Sinn, sie im Hintergrund zu starten.

Mein aktuelles Startskript navigiert einfach zu den gewünschten Verzeichnissen und öffnet alle Registerkarten in der richtigen Reihenfolge, um sie immer an derselben Position zu finden, wobei jede Registerkarte ihrem Zweck entsprechend benannt wird:

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 und arandr werden von der Shell getrennt und in einem eigenen Fenster ausgeführt, sodass dort der Parameter -e (execute) funktioniert. Ich denke für die Scala-REPL funktioniert es, da es der letzte Befehl in der Liste ist.

Benutzer unbekannt
quelle
Ihre Frage ist mir noch unklar. Sie möchten, dass ein Terminal zur Shell zurückkehrt, sobald der Befehl, mit dem es gestartet wurde, endet? So etwas wie xterm -e 'stuff;bash'?
Frostschutz
1
Diese Frage muss noch bearbeitet werden! Ich habe diesen Thread gefunden. Ich denke, das ist, wonach das OP sucht: Wie kann man das xfce4-Terminal offen halten? . Er möchte wissen, wie man auf einen Tab zugreift, auf dem der Schalter "-H" verwendet wurde, und ihn weiterhin als normales Terminalfenster verwendet. OP, können Sie bitte bestätigen, ob ich richtig bin?
slm
@slm: Ja, ich möchte das Terminal offen halten, um weitere Befehle zu verarbeiten. Ich möchte nur den ersten meiner Befehle automatisch starten und über mehrere benannte Registerkarten verfügen.
Benutzer unbekannt

Antworten:

20

Die -H/-holdOption besteht darin, das Terminal-Emulator-Fenster geöffnet zu lassen, sobald die darin gestarteten Anwendungen (Shell oder andere) beendet wurden. In diesem Zustand kann nichts mehr passieren.

Wenn Sie einen Befehl als Job einer interaktiven Shell im Terminalemulator von xfce4-terminal starten und die Shell weiterhin ausführen und interaktiv verwenden möchten, nachdem die Anwendung mit beendet wurde bash, können Sie die $PROMPT_COMMANDUmgebungsvariable xfce-terminalstart verwenden Eine interaktive Shell, die den angegebenen Befehl unmittelbar vor der ersten Eingabeaufforderung startet.

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 \
  ...

Auf diese Weise sind die Befehle Jobs dieser Shell, was bedeutet, dass Sie sie anhalten Ctrl-Zund später fortsetzen können, fg/bgals hätten Sie sie an der Eingabeaufforderung dieser interaktiven Shell eingegeben.

Das setzt allerdings voraus, dass Sie das nicht $PROMPT_COMMANDin Ihr setzen ~/.bashrc. Beachten Sie auch, dass der Beendigungsstatus des Befehls in nicht verfügbar ist $?.

Um den Befehl noch mehr an die Shell-Eingabeaufforderung anzupassen, können Sie ihn sogar zur Verlaufsliste hinzufügen. Mögen:

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

Auf diese Weise können Sie nach dem Beenden vidie UpTaste drücken, um denselben viBefehl abzurufen.

Ein einfacher Weg, es zu schreiben:

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'

Das:

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

Lösung wie in anderen Antworten angegeben funktioniert, hat aber einige Nachteile:

  1. Wenn Sie drücken, Ctrl-Cwährend cmdausgeführt wird, wird der äußere shProzess beendet, da für beide shund nur eine Prozessgruppe vorhanden ist cmd.
  2. Sie können nicht Ctrl-Zzum Suspendieren verwendencmd
  3. Wie bei der $PROMPT_COMMANDAnnäherung ist der Beendigungsstatus des Befehls in nicht verfügbar $?.

Sie können 1 oben umgehen, indem Sie Folgendes tun:

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

Oder:

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

Mit diesem letzteren können Sie den Prozess auch unterbrechen Ctrl-Z, aber Sie können ihn nicht verwenden fg/bg. Sie können es jedoch im Hintergrund fortsetzen, indem Sie a kill -s CONTauf der pid von ausführencmd .

Stéphane Chazelas
quelle
Wow. Das ist ziemlich kompliziert, aber es scheint zu funktionieren. :) Ich weiß nicht, warum die Belohnung verschwunden ist. Leider hatte ich vorher keine Zeit, die Hinweise zu testen.
Benutzer unbekannt
Ich verstehe nicht wirklich alle Regeln des Kopfgeldesystems. Da ich denke, dass Sie das Kopfgeld verdienen, starte ich ein neues Kopfgeld neu.
Benutzer unbekannt
Ja, die Prämien verfallen nach 7 Tagen und Sie haben 24 Stunden Zeit, sie zu vergeben. Wenn Sie sie nicht kennen, werden sie dem Benutzer mit der höchsten Wiederholung (2 oder höher) zugewiesen. Hier ist mehr als Sie jemals über Kopfgelder wissen wollten 8-): meta.stackexchange.com/questions/16065/…
slm
1
@AdrianLopez, in bashSkripten gibt es überhaupt keinen Verlauf, da es keine Zeilenbearbeitung oder Benutzerinteraktion gibt, es sei denn, Sie verwenden ihn read -ein Ihrem Skript (und Sie werden sehen, dass er dort history -s textfunktioniert, um den Verlauf, der von ihm gesehen wird, hervorzuheben read -e). Hier wird nicht history -svon einem Skript ausgeführt, sondern vom $PROMPT_COMMANDHook einer interaktiven Shell.
Stéphane Chazelas
1
@ StéphaneChazelas Erstaunlich. Nach Ihrer anderen wertvollen Antwort hier muss ich hinzufügen, dass xfce4-terminalab Version 0.6.3 nun ein zusätzlicher Parameter - --disable-server- durch die Umgebung geleitet werden soll. Ref: lists.debian.org/debian-user/2017/10/msg00045.html .
ジ ジ ー ジ
5

Soweit ich Ihre Frage verstanden habe, möchten Sie einige Prozesse in einem Terminal ausführen, in der Lage sein, sie Ctrl+ Cund danach das Fenster mit der Shell offen zu halten.

Wenn ich recht habe, könnte dies mit einem Befehl wie dem folgenden erreicht werden:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"
Rafael Cavalcanti
quelle
Funktioniert es mit mehreren Registerkarten?
Benutzer unbekannt
@userunknown Sicher. Fügen Sie einfach --tab vor den anderen Befehlen hinzu. Wenn Sie beispielsweise "ls / etc" und "ls / dev" ausführen möchten, geben Sie Folgendes aus: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Wenn Sie Gnome Terminal verwenden, müssen Sie --tab auch vor dem ersten Befehl schreiben.
Rafael Cavalcanti
Dies ist ein wenig hilfreich, wenn auch nicht so weit, wie ich es mir erhofft hatte. Wenn ich gradle mit `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c "stufe explodedWar explodedWarSync; befehl nicht gefunden "während der eingabe des befehls funktioniert es einwandfrei. Git, MySQL und Scala funktionieren auf diese Weise einwandfrei, aber bei JBoss beendet Strg-C den gesamten JBoss-Tab. Ich konnte die Shell nur von dort aus vorbereiten - vielleicht den Befehl zur Eingabe wiederholen. Ich verstehe nicht wirklich, was hier den Unterschied ausmacht.
Benutzer unbekannt
1

mehrere Apps in xfce4-terminalRegisterkarten

Hinzufügen einer interaktiven Shell zu jeder xfce-Registerkarte

Sie können diesen Hack verwenden, um eine Shell hinzuzufügen, wenn Sie Ctrl+Ceine Registerkarte:

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

Dadurch erhalten Sie Folgendes:

   ss von xfce mit tabs

   ss von xfce w / top Strg + C

slm
quelle
0

Beim Verlassen der Shell ohne -HTerminal wird auch geschlossen. Mit diesem Flag läuft das Terminal weiter, aber der Shell-Prozess wird geschlossen und kann nicht wiederbelebt werden.

Ich denke, Sie versuchen zu erreichen, dass Sie gerade Ihr Terminal starten und Ihre Entwicklungsumgebung hochfährt?

Sie können ein Shell-Skript erstellen und alle Ihre Befehle darin ablegen. Am Ende des Skripts starten Sie einfach Ihre Shell:

#!/bin/sh

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

$SHELL

# some cleanup commands if needed

Rufen Sie dann dieses Skript über auf xfce4-terminal -e /the/script. Beim Verlassen von$SHELL des übergeordneten Prozesses (Ihres Skripts) abgeschlossen ist und die Hintergrundaufgaben das Beendigungssignal erhalten und auch beendet werden.

Wenn Sie sie am Leben erhalten möchten, verwenden Sie zB nohup jboss &in Ihrem Skript

krissi
quelle
Das geht nicht, weil gradle und jboss permanent Output produzieren. Sie möchten nicht, dass sie ihre Ausgabe verwechseln. Das Datenbank- und Scala-Terminal sind interaktiv. Es hat keinen Sinn, sie in den Hintergrund zu stellen. Die Idee, andere Befehle in verschiedenen Registerkarten zu öffnen, ist, dass der Verlauf nur mit wenigen unterschiedlichen Befehlen zu einem Thema gefüllt und daher schnell durchsuchbar ist.
Benutzer unbekannt