Wie kann ich ein Skript erstellen, das Terminalfenster öffnet und darin Befehle ausführt?

140

Ich habe drei Skripte, die ich ausführen muss, wenn ich meinen Ubuntu-Rechner starte. Sie starten Dienste, die ich in meiner Entwicklungsumgebung verwende.

Dazu öffne ich manuell drei Terminals und gebe die Befehle ein.

Gibt es eine Möglichkeit, ein Skript zu erstellen, das drei Terminals öffnet und jeweils einen Befehl ausführt? (Jeder Befehl sollte sich in einem separaten Terminalfenster befinden, damit ich ihre Ausgabe sehen kann.)

JSBach
quelle

Antworten:

138
gnome-terminal -e command

oder

xterm -e command

oder

konsole -e command

Ja schon

terminal -e command

So bleibt das Terminal beim Beenden des Befehls erhalten:

In der Konsole gibt es eine --nocloseFlagge.

In xterm gibt es eine -holdFlagge.

In finden gnome-terminalSie unter Bearbeiten -> Profil - Einstellungen -> Titel . Klicken Sie auf die Registerkarte Befehl . Wählen Sie Hold the terminal aus dem Dropdown-Menü mit der Bezeichnung When command exit . Sie sollten dafür ein neues Profil anlegen und mit ausführen

gnome-terminal --window-with-profile = Befehl NAMEOFTHEPROFILE -e
nickguletskii
quelle
1
Wenn ich versuche, das Terminal zu halten, wird "untergeordneter Prozess normal mit Statuscode 127 beendet"
Darshan Chaudhary,
2
gnome-terminal hat keine title-Option mehr :(
törzsmókus
1
@ törzsmókus es ist ja 2017! LTS-Versionen haben eine Laufzeit von 5 Jahren. 14.04 endet nicht vor April 2019. wiki.ubuntu.com/Releases
bhass1
1
gnome-terminal -e commandfunktioniert nur, wenn angegeben commandist. So funktioniert das nicht: gnome-terminal -e "echo hello world; sleep 3"aber dies tut: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Seufzer.
BGoodr
3
Sie können das Gnome-Terminal auch offen halten, indem Sie ; $SHELLam Ende des Befehls etwas hinzufügen . Bsp .:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples
58

Statt Hartcodierung gnome-terminal, konsoleet cetera, verwenden Sie das System - Alternativen. Das Programm, das den Standard-Terminalemulator ausführt, ist:

x-terminal-emulator

Auf meinem System wird jedes Mal, wenn ich diesen Befehl ausführe, eine neue Instanz von Konsole geöffnet.

Glücklicherweise scheinen die Terminals die -eOption zur Ausführung eines Befehls zu unterstützen (ich habe es für konsoleund überprüft gnome-terminal). Argumente nach dem Befehl werden an den aufgerufenen Befehl übergeben. Bash weigert sich, in meinem Terminal offen zu bleiben, ein zusätzliches Skript wird benötigt, um ein Terminal zu erhalten:

#!/bin/sh
"$@"
exec "$SHELL"

Wenn Sie das vorherige Skript als gespeichert /home/user/hackyund ausführbar gemacht haben, würden Sie Ihre Skripte ausführen mit:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

Der vollständige Pfad ist erforderlich und /home/user/hackymuss ausführbar sein.

Mein früherer Versuch, ein Skript in einem neuen Terminalfenster auszuführen, war in Revision 2 zu finden , bevor mir klar wurde, dass Argumente übergeben werden können x-terminal-emulator.

Lekensteyn
quelle
In diesem Fall hilft es nicht viel, da der Fragesteller etwas tun möchte, das nicht für alle Terminals gleich ist.
nickguletskii
Versuch 3: Dieser Versuch sollte das Terminal offen halten und das Programm mit optionalen Argumenten ausführen.
Lekensteyn
1
Ich habe die Gnome-Option verwendet, aber sobald ich mein Skript ausgeführt habe, wird das Hauptterminal geschlossen !! .. irgendeine Idee warum?
McLan
3
@ Suda.nese Das ist beabsichtigt, wenn das "Terminal" fertig ist, das Skript auszuführen, wird es beendet, weil nichts mehr zu tun ist. Sie können dies "beheben", indem Sie eine Shell aufrufen, in der Sie command ( bash) ausführen können oder eine Zeile wie read -p "Press Return to continue".
Lekensteyn,
1
Wie können Sie mehr als einen Befehl im Terminal ausführen? Zum Beispiel cd xxx && start.sh. Der Interpret sieht das && als den zweiten Teil des Befehls (was logisch ist), aber wenn ich es zitiere, dann versucht er, das Ganze als ein einziges großes Argument
Richard,
9

Recht einfach-

#!/bin/bash

/etc/init.d/ccpd status

Dies ist ausreichend für andere Befehle, die im Terminal nichts anzeigen müssen. Hier muss aber der Status angezeigt werden.
Es muss also in einem Terminalfenster ausgeführt werden

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

Der andere Beitrag sollte []ein Platzhalter sein

Hier ist "NAMEOFTHEPROFILE" durch den Namen des Profils zu ersetzen, das "das Terminal hält, wenn der Befehl beendet wird".

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Karthik T
quelle
1
Ich glaube, @cipricus []war nur Platzhalter
Karthik T
verstanden. aber ich muss das terminal nicht so schnell schließen lassen. Ich denke, das ist auch in der verknüpften Frage
@cipricus hast du das profil eins ausprobiert? --window-with-profile=NAMEOFTHEPROFILEIch muss nur noch hinzufügen , was ich gegeben habe
Karthik T
1
@cipricus Ich müsste nach Hause, um bessere Anweisungen zu geben, aber die Idee ist, ein spezielles Profil mit diesem Optionssatz zu erstellen und den Namen des speziellen Profils an der obigen Stelle zu verwenden.
Karthik T
2
@cipricus wenn dir das reicht, dann ist das ok. Das Profil ist nichts weiter als eine Gruppe von Einstellungen. Sie können die Einstellungen NUR für die Verwendung in Ihrem Skript einrichten und müssen sie nicht in allen Terminals verwenden. Unter Bearbeiten -> Profile können Sie alle vorhandenen Profile anzeigen. Fügen Sie dort ein Profil hinzu, das wie in dem von Ihnen verknüpften Beitrag
Karthik T vom
5

Unterstützt von @ nickguletskiis Antwort und meinem eigenen Kommentar unter seiner Antwort und inspiriert von @ grabantots Aufwertung meines Kommentars, ist dies meine bevorzugte Methode, besonders wenn ich möchte, dass das Terminal geöffnet bleibt, damit ich es dann manuell verwenden kann.

Ex. Verwendung: Dies ist sehr nützlich, um Ihre Startprogramme zu erweitern, damit dieses Skript ausgeführt, ein Terminal geöffnet, eine Registerkarte im Terminal erstellt und benannt und ein Befehl für Sie ausgeführt wird. Sie können auch einfach einen Symlink zu diesem Skript auf Ihrem Desktop hinzufügen. Ich benutze diesen Ansatz, um auf ein einzelnes Symbol auf meinem Desktop zu doppelklicken und es eine Reihe von Terminals (mit verschiedenen Registerkarten, die nach der Arbeit benannt sind, die ich in ihnen ausführen werde) und einzurichtenden Programmen öffnen zu lassen Meine Programmierumgebung zum Beispiel für die tägliche Arbeit.

Hier ist ein Beispiel, das einen einzelnen Tab öffnet, ihn als "Test" bezeichnet und dann den darin enthaltenen einfachen Befehl cd /etc; lsausführt. Der $SHELLTeil am Ende zwingt die Shell, offen zu bleiben, damit Sie ihre Ausgabe sehen und sie weiter verwenden können (das habe ich irgendwo anders bei Stack Overflow gelernt):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Hier ist ein etwas komplizierteres Beispiel, das 3 verschiedene Tabs im selben Gnome-Terminal öffnet. Genau das macht meine Desktop-Verknüpfung, damit ich eine Reihe von Programmierfenstern gleichzeitig öffnen kann:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Hier ist eine Aufschlüsselung des obigen Befehls:

  • gnome-terminal = Öffne ein Gnome-Terminal
  • --tab = öffne eine einzigartige Registerkarte für das, was als nächstes kommt
  • --title="tab 1" = Titel dieses Tabs "Tab 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= führe den bash -c 'cd /etc; ls; $SHELL'Befehl aus, den ich mir gerade als Beispiel ausgedacht habe; Das macht es:
    • bash -c sagt, es ist ein Bash-Befehl
    • cd /etc = 'c'hange' d'irectory in den "/ etc" Pfad
    • ls = 'Der Inhalt dieses Verzeichnisses ist nicht vorhanden
    • $SHELL= Dieser kryptische Leckerbissen wird benötigt, um die Shell offen zu halten, damit Sie damit arbeiten können. Wenn Sie möchten, dass die Shell geöffnet wird, führen Sie Ihren Befehl aus und schließen Sie ihn. Entfernen Sie einfach diesen Teil. Ich möchte jedoch, dass die Registerkarte geöffnet bleibt, damit ich die Programmierung magisch gestalten kann. :)
  • Wir beginnen dann wieder bei dem --tabTeil, um Tab 2 zu produzieren, und dann noch einmal für Tab 3. Passen Sie es nach Herzenslust an.

Bildschirmfoto:

Bildbeschreibung hier eingeben

Gabriel Staples
quelle
1
Ich bin froh, dass ich hilfreich war.) Ich habe auch Skripte, auf die ich einfach klicken und mit der Arbeit am Projekt beginnen kann. Es gab zwei Probleme mit ihnen: viele Terminalfenster (hatten einen separaten Bildschirm für sie) und Fenster, die sich zum Beispiel nach einem Serverabsturz schlossen. Diese Antwort löst meine beiden Probleme mit --tab + $ SHELL. Nice
grabantot
1

Kommentar für die Antwort von Lekensteyn. Ich weiß, dass dies ein alter Beitrag ist, aber für alle, die dies nützlich finden (wie ich es gerade getan habe), anstatt ein anderes "Hacky-Skript" zu erstellen, indem Sie einfach eine Funktion in das Skript einfügen, das Sie aufrufen

hacky_function()
{
"$@"
exec "$SHELL"
}

Rufen Sie Ihr Skript mit den optionalen Argumenten "x-terminal-emulator -e / path / to / script hacky_function here" auf.

Vergessen Sie nicht, "$ @" am Ende des Skripts einzufügen

Sruli
quelle
-2

Verwenden Sie den Befehl screen und -d, um die Verbindung zu einer vorhandenen Bildschirmsitzung zu trennen, und fügen Sie hier erneut Folgendes hinzu: -m Erzwinge eine neue Bildschirmsitzung -S erstelle eine benannte Sitzung, anstatt den Standardnamen zu verwenden

Jack Heath
quelle
Diese Antwort ist überhaupt nicht klar, bitte
versuchen
@azerafati in der Tat, Bildschirm öffnet kein Terminal-Fenster ... ist nicht einmal von diesem fantastischen Paket beabsichtigt ...
erm3nda