Öffnen Sie das Gnome-Terminal programmgesteuert und führen Sie die Befehle aus, nachdem bashrc ausgeführt wurde

35

Zum Starten meiner Entwicklungsumgebung habe ich ein kleines Skript geschrieben. Ein Teil ist das Öffnen eines Gnome-Terminals mit mehreren Registerkarten, auf denen automatisch einige Befehle ausgeführt werden sollen. Einige dieser Befehle hängen von einem bereits ausgeführten .bashrc ab. Aber bei der Verwendung

gnome-terminal --tab -e "Befehl" --tab --tab

Der Befehl wird ausgeführt, bevor .bashrc ausgeführt wurde. Gibt es eine Möglichkeit, ein automatisiertes Gnome-Terminal so zu machen, dass es sich wie ein manuell benutztes verhält? (sogar Befehle wie "cd / foo / bar" funktionieren nicht mit gnome-terminal -e)

Zardoz
quelle

Antworten:

45

Sobald gnome-terminal bash gestartet hat, ist es aus der Schleife, was die Befehlsausführung betrifft: Es verwaltet nur die Ein- und Ausgabe. Sie benötigen also die Kooperation von bash, um etwas auszuführen, nachdem ~/.bashrces geladen wurde.

Erstens müssen Sie in vielen Fällen keine weiteren Befehle ausführen ~/.bashrc. Zum Beispiel kann das Öffnen eines Terminals in einem bestimmten Verzeichnis einfach mit erfolgen cd /foo/bar && gnome-terminal. Sie können Umgebungsvariablen in ähnlicher Weise festgelegt: VAR=value gnome-terminal. (Wenn Sie ~/.bashrcUmgebungsvariablen überschreiben, machen Sie es falsch: Definitionen von Umgebungsvariablen gehören dazu.~/.profile )

Befehle im Terminal ausführen, aber vorher ~/.bashrckönnen Sie tun

gnome-terminal -x sh -c 'command1; command2; exec bash'

Wenn Sie mehrere Registerkarten verwenden möchten, müssen Sie -estatt verwenden -x. Gnome-terminal spaltet das Argument von -eat Leerzeichen nicht über eine Shell, sondern unbeholfen auf. Sie können jedoch einen Shell-Befehl schreiben, wenn Sie sicherstellen, dass keine Leerzeichen enthalten sind. Zumindest mit Gnome-Terminal 2.26 können Sie jedoch Tabulatoren verwenden ( <TAB>durch ein literales Tabulatorzeichen ersetzen ):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

Wenn Sie danach Befehle ausführen ~/.bashrcmüssen, müssen Sie die Befehle ausführen. Fügen Sie beispielsweise den folgenden Code am Ende von ein ~/.bashrc:

eval "$BASH_POST_RC"

Dann, um einen Code nach (wirklich am Ende von) Ihrem BashRC auszuführen:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

oder (weniger schwer zu zitieren)

BASH_POST_RC='command1; command2' gnome-terminal

Obwohl ich dies nicht besonders empfehle, sind Sie möglicherweise an den Techniken interessiert, die unter So starten Sie ein Terminal mit einem bestimmten Text, der bereits in der Befehlszeile eingegeben wurde. .

Gilles 'SO - hör auf böse zu sein'
quelle
Ja, in der Tat ein schöner Trick. Daran hätte ich nie gedacht. Jetzt muss ich eine Möglichkeit finden, die Variable BASH_POST_RC für die jeweilige Registerkarte unterschiedlich festzulegen. Und das scheint immer noch ein Problem zu sein. Ein einfaches "gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" ist nicht möglich :-(
Zardoz
@Zardoz: Tatsächlich kannst du das Gnome-Terminal mit Tabulatorzeichen austricksen (siehe meine überarbeitete Antwort). Beachten Sie die verschiedenen Ebenen des Zitierens.
Gilles 'SO- hör auf böse zu sein'
..es funktioniert :-) ... vielen dank für deine lösung und deine geduld. Hier mein vollständiger Befehl (funktioniert auch mit den Leerzeichen in den Befehlen: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rail server "; exec bash" '--tab -e' bash -c "exportiere BASH_POST_RC =" autotest "; exec bash" '--tab
Zardoz
Endlich hat es geklappt ... Nach sooo vielen Tests mit Anführungszeichen rundum. Hier ist meine, die zsh benutzt und gleichzeitig einen Server und eine Konsole öffnet:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger
1
@terdon Nein, gnome-terminal -eruft überhaupt keine Shell auf. Wenn Sie ausführen gnome-terminal -e 'sleep 9', wird der Befehl sleepmit dem Argument ausgeführt 9, und es ist keine Shell beteiligt. Wenn Sie ausführen , gnome-terminal -e 'sleep 9;bash'dann öffnet das Terminal und schließt sofort, da sleepbeschwert sich, dass 9;bashkeine gültige Zeitintervall ist. Sie können beobachten, was los iststrace -f -eexecve gnome-terminal -e …
Gilles 'SO - aufhören, böse zu sein'
6

Wenn Sie die -eOption verwenden, gnome-terminalwird der Befehl ausgeführt, ohne eine neue Shell zu starten (Sie können sogar so etwas wie: ausführen gnome-terminal -e gedit). Wenn Sie also einen Befehl in die bashShell in einem neuen Terminal / Tab ausführen möchten, müssen Sie Folgendes tun:

gnome-terminal -x bash -c "command"

Beachten Sie jedoch, dass am "command"Ende auch das Terminal / der Tab endet.

cYrus
quelle
1
Ich denke du meinst gnome-terminal -x bash -c "command"( -eerwartet ein einziges Argument). Und es ist ziemlich einfach, eine Shell danach auszuführen command, zumindest solange Sie einen einzelnen Tab starten - siehe meine Antwort .
Gilles 'SO - hör auf böse zu sein'
gnome-terminal -x "bash" -c "command"arbeitete für mich. Beachten Sie Anführungszeichen für den Wert -x arg.
m3nda,
Ich bekomme # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.'
MrCholo
1
bitte, was machen wir da die -xund -eoptons veraltet sind ???
Nyxee
Ich glaube, dass dies nicht ausgeführt wird, ~/.bashrcbevor der Befehl ausgeführt wurde, wie ursprünglich vom OP angefordert.
IgNite