Öffnen mehrerer Terminal-Registerkarten und Ausführen des Befehls


9

Ich muss mehrere Terminal-Registerkarten öffnen, ihnen Titel geben, in ein Verzeichnis wechseln und jede Registerkarte einen Befehl ausführen lassen.

Ich bin neu in Linux und Shell-Skripten. Nachdem ich online gesucht und einige Lösungen überprüft habe, habe ich dieses Skript erstellt ( BEARBEITET basierend auf den folgenden Antworten):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Es öffnet die Registerkarten, benennt sie, führt jedoch die Befehle, die diesen Fehler erzeugen, nicht aus:

Beim Erstellen des untergeordneten Prozesses für dieses Terminal ist ein Fehler aufgetreten

Ein weiteres Manko ist, dass wenn ich den laufenden Befehl anhalte, die Registerkarte geschlossen wird, was ich nicht möchte. Ich muss in der Lage sein, den Befehl zu stoppen und ihn auf derselben Registerkarte erneut auszuführen.

Was ist los mit dem Skript? Gibt es einen anderen einfacheren Weg, dies zu tun?

Hinweis: Wenn ich den Teil (-e "\" bash -c $ {cmds [i]}; bash \ "") aus dem Befehl entfernt habe, werden die Registerkarten im angegebenen Verzeichnis geöffnet und ohne Fehler benannt.

-Edit-1:

@Tuknutx Antwort unten und Bearbeiten des Skripts Nach der Anwendung der Fehler erscheint nicht mehr, aber es gibt mir bash: rails c: command not foundund rails serstellt eine neue Rails - Anwendung , anstatt den Schienen - Server zu starten, ich bin mit .rmvrc einen gemset auszuwählen , sobald diese Ordner zugegriffen wird .


Wenn Sie Ihr Skript auf Ihrem Ubuntu-Boot ausführen möchten: - Sie können Ihr Skript als Upstart-Dienst ausführen ( help.ubuntu.com/community/UbuntuBootupHowto ) oder: " Startanwendungen " in Ihrer Desktop-Umgebung verwenden
Aboelnour

Wenn ich schreibe cmds[1]="'ping 192.168.9.9'", gibt es mir den gleichen Fehler, aber ich habe ihn durch Entfernen eines einfachen Zitats behoben. Also, wenn ich schreibe, cmds[1]="ping 192.168.9.9"funktioniert es.
Gänseblümchen

@Brary, aber ich verstehe nicht, warum es drei Registerkarten öffnet - eine Standardeinstellung und zwei weitere, die im Skript festgelegt wurden. Weil wir definieren tab=" --tab-with-profile=Default"?
Gänseblümchen

Antworten:


3

Ich würde empfehlen, tmuxmit zu arbeiten tmuxinator, es erledigt den Job für Sie und Sie können sich auch auf terminatorLayouts verlassen!

Für die terminatorLayout-Kasse mhnagaokas Antwort hier auch askubuntu:

  1. Klicken Sie nach dem Einrichten Ihres Layouts mit der rechten Maustaste auf einen Terminalhintergrund, wählen Sie Einstellungen → Registerkarte Layouts und klicken Sie auf die Schaltfläche Hinzufügen .

  2. Geben Sie ihm einen Namen und klicken Sie auf Schließen .

  3. Dies sollte die erwähnte ~/.config/terminator/configDatei erstellen .

  4. Jetzt können Sie den Terminator mit dem gespeicherten Layout starten, indem Sie: terminator -l yourLayout( Ihr Layout durch das ersetzen, was Sie in Schritt 2 ausgewählt haben).

  5. (optional) Bearbeiten Sie die ~/.config/terminator/configDatei so, dass sie an der Stelle, an der sie steht [layouts]und darunter verschachtelt [[yourLayout]]ist, Ihr Layout in Standard umbenennt und das vorherige Standardlayout entfernt / umbenennt . Wenn Terminator jetzt ohne Parameter startet, wird Ihr benutzerdefiniertes [[default]]Layout geladen !


2

Um einige der anderen Antworten und ihre Kommentare zusammenzufassen, habe ich Folgendes erreicht:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Beachten Sie, dass ich die Registerkarte "Master", die Profile und die Titel (in denen sie veraltet zu sein scheinen gnome-terminal) entfernt habe.


Die Ausgabe von $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.`Use“ - ”, um die Optionen zu beenden und die Befehlszeile danach auszuführen. . that's an output but the comands get executed. When i use $ tab - `Der Befehl wird nicht ausgeführt und das Terminal zeigt Folgendes an:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
Nyxee

1

Versuche dies:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

Andernfalls wird der gesamte Ausdruck nach -e als Befehl interpretiert.

Um Aliase aus .bashrc einzuschließen, verwenden Sie -icanstelle vonc


Der Fehler wird nicht mehr angezeigt, danke. Aber es gibt mir bash: rails c: command not foundund 'Rails s' erstellt eine neue Rails-App, anstatt den Rails-Server zu starten. Dies ändert den Umfang der Frage, ich werde sie mit
Ihrer

Hat es funktioniert, wenn Sie rails cein Terminal ohne etwas anderes anprobiert haben ? Vielleicht sollte es sein rails -c?
TuKsn

Versucht, dass das nicht funktioniert hat. Ich habe es sogar versucht rvm list gemsetsund es heißt No command 'rvm' found.. Führen Sie den gleichen Befehl rvm list gemsetsin der ersten Registerkarte aus, die geöffnet wird, ohne einen Befehl auszuführen, und es hat funktioniert! Führt es den Befehl aus, bevor die Umgebung geladen und die .rvmrc-Datei geladen wird?
Brary

1

Das Argument, das Sie der Option -e geben, enthält "bash -c command; bash"die Anführungszeichen. Es interpretiert diese ganze Zeichenfolge als den Namen eines Befehls! Versuchen Sie stattdessen Folgendes : -e "bash -c 'command ; bash'". Auf diese Weise wird in Ihrem Terminalfenster ausgeführt command, und danach erhalten Sie eine Tochter-Shell, von der ich annehme, dass Sie sie möchten. Übrigens kann man auch sagen 'command & bash'; Dadurch wird der Befehl im Hintergrund ausgeführt und Sie erhalten sofort die Tochter-Shell.


Ich änderte sich dies options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )in options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )und es gab mir den gleichen Fehler .. bin ich es richtig zu machen?
Brary

Nicht ganz richtig: Entfernen Sie "vor der ersten Bash" und "nach der zweiten Bash".
Silvio Levy

Vielen Dank, ich habe die Frage bearbeitet und den Umfang geändert, um Schienen und RVM einzuschließen.
Brary
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.