Erstellen Sie neue Terminator-Registerkarten aus dem Bash-Skript


9

Ich habe ein Bash-Skript geschrieben, das vier lang laufende Prozesse (jeweils 20 bis 30 Minuten) ausführt:

terminator -T "<NAME-1>" -e "<COMMAND-1>" &
terminator -T "<NAME-2>" -e "<COMMAND-2>" &
terminator -T "<NAME-3>" -e "<COMMAND-3>" &
terminator -T "<NAME-4>" -e "<COMMAND-4>" &

(Wo <COMMAND-X>ist ein Wert, der zuvor von mehreren Bash-Zeilen erstellt wurde, einschließlich Aufrufen von Kubernetes).

Wenn ich mein Skript ausführe, wird jeder dieser Prozesse in einem neuen Terminator-Fenster geöffnet. Um zu vermeiden, dass jedes Mal, wenn ich das Skript ausführe, vier neue Fenster erscheinen, möchte ich, dass sie alle in unterschiedlichen Ansichten eines einzelnen neuen Fensters beginnen. Gibt es eine Möglichkeit, dies zu tun? Das Handbuch enthält nichts .

Ich würde eine Lösung akzeptieren, die ein anderes Terminal verwendet.

Antworten:


10

Öffnen Sie zunächst eine Terminator-Instanz, teilen Sie sie wie gewünscht in 4 Bereiche auf und speichern Sie sie als neues Layout (schließen Sie alle geöffneten Terminalfenster mit Ausnahme des Fensters, das Sie mit Ihrem neuen Profil eingerichtet haben). Für jede der vier Scheiben, einen benutzerdefinierten Befehl hinzufügen , sondern nur den Text hinzufügen COMMAND1, COMMAND2usw. Speicher , um das neue Layout foo(oder was auch immer). An diesem Punkt sollte Ihr ~/.config/terminator/configungefähr so ​​aussehen:

[global_config]
  enabled_plugins = LaunchpadCodeURLHandler, APTURLHandler, LaunchpadBugURLHandler
  focus = mouse
  suppress_multiple_term_dialog = True
  title_use_system_font = False
[keybindings]
[layouts]
  [[default]]
    [[[child0]]]
      fullscreen = False
      last_active_term = ad14f6cd-bcc3-4a80-9852-3fe64f7fc2eb
      last_active_window = True
      maximised = False
      order = 0
      parent = ""
      size = 735, 474
      title = sometitle
      type = Window
  [[foo]]
    [[[child0]]]
      fullscreen = False
      last_active_term = 18ebf009-c427-4c2f-8017-78c379a72d31
      last_active_window = True
      maximised = False
      order = 0
      parent = ""
      position = 2730:254
      size = 735, 474
      title = NAME-1
      type = Window
    [[[child1]]]
      order = 0
      parent = child0
      position = 237
      ratio = 0.5
      type = VPaned
    [[[child2]]]
      order = 0
      parent = child1
      position = 368
      ratio = 0.500680272109
      type = HPaned
    [[[child5]]]
      order = 1
      parent = child1
      position = 368
      ratio = 0.500680272109
      type = HPaned
    [[[terminal3]]]
      command = COMMAND1
      order = 0
      parent = child2
      profile = default
      title = NAME-1
      type = Terminal
      uuid = 01e46a5a-0a12-4861-a81e-e376af6041a7
    [[[terminal4]]]
      command = COMMAND2
      order = 1
      parent = child2
      profile = default
      type = Terminal
      uuid = 094d544d-944c-48a7-9960-00370253e799
    [[[terminal6]]]
      command = COMMAND3
      order = 0
      parent = child5
      profile = default
      type = Terminal
      uuid = fe19f601-1963-4af7-8870-f90e289d3d27
    [[[terminal7]]]
      command = COMMAND4
      order = 1
      parent = child5
      profile = default
      type = Terminal
      uuid = 18ebf009-c427-4c2f-8017-78c379a72d31
[plugins]
[profiles]
  [[default]]
    cursor_color = "#aaaaaa"
    font = Monaco 11
    scrollback_infinite = True
    scrollback_lines = 5000
    use_system_font = False

Ändern Sie nun Ihr Bash-Skript, um es COMMANDNdurch den eigentlichen Befehl zu ersetzen, den Sie ausführen müssen:

#!/bin/bash

## change these to whatever you actually need
command1="echo one; bash"
command2="echo two; bash"
command3="tail -f /var/log/messages; bash"
command4="top"

## Modify terminator's config
sed -i.bak "s#COMMAND1#$command1#; s#COMMAND2#$command2#; s#COMMAND3#$command3#; s#COMMAND4#$command4#;" ~/.config/terminator/config

## Launch a terminator instance using the new layout
terminator -l foo

## Return the original config file
mv ~/.config/terminator/config.bak ~/.config/terminator/config

Durch Ausführen dieses Skripts wird nun ein neues Terminalfenster mit 4 Fenstern geöffnet, in denen jeweils einer Ihrer Befehle ausgeführt wird.

Wichtig : Wenn der Befehl ausgeführt und dann beendet wird (im Gegensatz zu etwas, topdas ausgeführt wird, bis Sie ihn zum Stoppen anweisen), benötigen Sie COMMAN; bashden Befehl, damit eine neue Shell gestartet wird. Andernfalls wird der Befehl ausgeführt und die Shell wird sofort beendet. Deshalb habe ich ; bashnach jedem Befehl außer topin y Skript.


Der IIRC-Terminator hat die Angewohnheit, beim Beenden die aktuelle Konfiguration auf die Festplatte zu schreiben. Wenn ich also Änderungen an der Konfiguration mit einem Editor vornehme, während der Terminator noch ausgeführt wird, und dann den Terminator neu starte, habe ich die angenehme Überraschung, dass keine meiner Änderungen wirksam wird.
Muru

@muru gibt es einige solche seltsamen Dinge ja. Ich glaube, ich musste alle offenen Terminalfenster schließen, als ich das neue Layout erstellte. Warte, lass mich eine Notiz dazu hinzufügen.
Terdon

Obwohl Ihnen der Befehl zum Erstellen der fehlt config.bak.
Ben Watson

@ BenWatson nein, der sedBefehl erstellt die config.bak. Das -i.bakmacht der.
Terdon

Das ist interessant, ich musste eine Zeile hinzufügen, damit das bakandere nicht richtig zurückgesetzt wurde. Ich werde irgendwann nachforschen.
Ben Watson

4

Alternative:

Da Sie erwähnt haben, dass Sie eine alternative Lösung akzeptieren würden, sollten Sie die Verwendung in Betracht ziehen gnome-terminal. In der Vergangenheit habe ich dafür Skripte geschrieben, die das Laichen von Fenstern mit mehreren Registerkarten und das Ausführen eigener Befehle ermöglichen. Bitte sehen Sie dies zum Beispiel: https://askubuntu.com/a/863179/295286

Was den Terminator selbst betrifft, scheint es möglich zu sein, neue Registerkarten für bereits vorhandene Fenster über die --new-tabOption zu erzeugen, aber ich sehe keine Option, ein Fenster mit mehreren Registerkarten mit einzelnen Befehlen außer über die --layoutOption zu erzeugen. Sie können es natürlich automatisieren, da alle Layouts in ~/.config/terminator/configDateien gespeichert sind, sodass Sie benutzerdefinierte Konfigurationsdateien schreiben können. Ich werde versuchen, eine zu schreiben, wenn ich nicht vergesse, aber ich denke, der gnome-terminalAnsatz ist viel einfacher und genau das, was Sie wollen.

Ursprüngliche Antwort

Terminator hat eine layoutVoreinstellung, die Sie mit einer bestimmten Anzahl von Registerkarten und Teilungen verwenden und ihnen bestimmte Farbprofile zuweisen können. Sie möchten das Fenster öffnen, beliebig viele Registerkarten hinzufügen und dann mit der rechten Maustaste klicken, zu Einstellungen, Registerkarte Layouts gehen und auf die Schaltfläche Hinzufügen klicken

Geben Sie hier die Bildbeschreibung ein

Wenn Sie mit dem Bearbeiten des Layouts fertig sind, speichern Sie es. Jetzt können Sie use aufrufen terminator -l <Layout Name>, um Fenster mit genau diesen Registerkarten zu erzeugen . Auf meinem Screenshot sehen Sie beispielsweise, dass ich ein customLayout habe, das ich verwenden würdeterminator -l custom


Das scheint ein Fortschritt zu sein, aber wenn ich -l custommeine vier terminatorBefehle hinzufüge , habe ich nur vier separate Fenster (von denen jedes in vier Ansichten unterteilt ist), von denen jeweils nur die Ansicht oben links ausgefüllt ist. Wie kann ich jeden Befehl zwingen, in dasselbe Fenster zu gelangen?
Ben Watson

@ BenWatson Schauen Sie sich den Screenshot an. Sie können jeder Terminalregisterkarte einen benutzerdefinierten Befehl zuweisen. Ich würde empfehlen, dass Sie es so verwenden: bash -c "COMMAND 1 ; bash"und wiederholen Sie dies einfach für jeden Befehl. Auf diese Weise stellen wir sicher, dass das Fenster nicht geschlossen wird, wenn der Befehl nur von kurzer Dauer ist
Sergiy Kolodyazhnyy

Ich kann das benutzerdefinierte Terminator-Befehlsfeld nicht verwenden, da das Skript zuvor einige andere Aktionen ausführt, um die <COMMAND>Felder zu füllen . Natürlich könnte ich die custom command:Box selbst Skripte ausführen lassen ... Es ist nicht besonders elegant, da ich anderen nicht einfach sagen kann, dass sie ein Skript auschecken und ausführen sollen, aber es könnte die beste Lösung sein. Ich werde es einen Tag dauern, um zu sehen, ob jemand eine Lösung hat, sonst werde ich diese auswählen. Vielen Dank.
Ben Watson

Ich werde einen Blick auf die Manpage werfen und Sie wissen lassen, ob mir etwas einfällt. Als Alternative kann Gnome-Terminal tun, was Sie wollen, das weiß ich, weil ich selbst
solche

@BenWatson das ist nicht ganz klar, ich stimme terdon zu, aber ich weiß irgendwie, was du versuchst zu tun. Ich würde Ihnen sicher empfehlen, die Frage zu bearbeiten - andere Benutzer finden Ihre Frage möglicherweise unklar und schließen sie
Sergiy Kolodyazhnyy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.