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 found
und rails s
erstellt eine neue Rails - Anwendung , anstatt den Schienen - Server zu starten, ich bin mit .rmvrc einen gemset auszuwählen , sobald diese Ordner zugegriffen wird .
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.tab=" --tab-with-profile=Default"
?Antworten:
Ich würde empfehlen,
tmux
mit zu arbeitentmuxinator
, es erledigt den Job für Sie und Sie können sich auch aufterminator
Layouts verlassen!Für die
terminator
Layout-Kasse mhnagaokas Antwort hier auch askubuntu:quelle
Um einige der anderen Antworten und ihre Kommentare zusammenzufassen, habe ich Folgendes erreicht:
Beachten Sie, dass ich die Registerkarte "Master", die Profile und die Titel (in denen sie veraltet zu sein scheinen
gnome-terminal
) entfernt habe.quelle
$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)
Versuche dies:
Andernfalls wird der gesamte Ausdruck nach -e als Befehl interpretiert.
Um Aliase aus .bashrc einzuschließen, verwenden Sie
-ic
anstelle vonc
quelle
bash: rails c: command not found
und 'Rails s' erstellt eine neue Rails-App, anstatt den Rails-Server zu starten. Dies ändert den Umfang der Frage, ich werde sie mitrails c
ein Terminal ohne etwas anderes anprobiert haben ? Vielleicht sollte es seinrails -c
?rvm list gemsets
und es heißtNo command 'rvm' found
.. Führen Sie den gleichen Befehlrvm list gemsets
in 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?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ührtcommand
, 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.quelle
options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )
inoptions+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )
und es gab mir den gleichen Fehler .. bin ich es richtig zu machen?