Ich verwende Linux und erledige meine gesamte Befehlszeilenarbeit gerne in einer einzigen Bildschirmsitzung, damit ich meine grafische Anmeldung und dergleichen neu starten kann, ohne meine Terminals zu verlieren. Beim Abmelden und erneuten Anmelden an meiner Grafiksitzung werden jedoch alle Sitzungsumgebungsvariablen geändert, z. B. DBus-Sitzungen. Dies bedeutet, dass meine Bildschirmsitzung nach dem erneuten Anmelden die alten (und falschen) Umgebungsvariablen enthält. Wenn ich jetzt versuche, grafische Programme von meiner Bildschirmsitzung aus zu starten, wird bestenfalls eine Warnung ausgegeben, dass keine Verbindung zum Sitzungsbus hergestellt werden kann. Im schlimmsten Fall können sie nicht vollständig starten.
Ich suche also nach einer Möglichkeit, Umgebungsvariablen in einer laufenden Instanz des Bildschirms zu ändern, sodass alle anschließend erstellten Bildschirmfenster die neuen Umgebungsvariablen übernehmen. Gibt es eine Möglichkeit, dies zu tun?
quelle
setenv [var [string]] Set the environment variable var to value string. If only var is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells.
Antworten:
Sie können ein Shell-Skript nicht von der
screen
Sitzung aus starten, da es die alte Umgebung erben würde. Sie können jedoch ein Fifo verwenden, um die neuen Umgebungsvariablen in die alte Bildschirmsitzung zu übernehmen. Sie können dieses FIFO füllen, wenn Sie Ihre grafische Sitzung starten.Starten Sie dieses Skript beim Anmelden im Hintergrund (es wird erst beendet, wenn alle Variablen daraus gelesen wurden).
Jetzt können Sie aus dem Fifo lesen, zB diese Funktion zu Ihrem hinzufügen
.bashrc
damit Sie in Ihrer alten
screen
Sitzung könnenquelle
screen
. AFAIKscreen
stellt keine Sockets oder ähnliches zur Verfügung, um mit laufenden Sitzungen von außen zu kommunizieren.screen
Sitzung bereits die aktuellen UmgebungsvariablenIch habe ein Skript dafür implementiert. Sie können es hier herunterladen : https://github.com/DarwinAwardWinner/screen-sendenv
Nach dem Einfügen
screen-sendenv.py
in Ihr$PATH
können Sie das folgende Snippet in Ihrem .bashrc verwenden:Um es zu verwenden, führen
screen_pushenv
Sie es einfach aus, bevor Sie erneutscreen -r
eine Verbindung zu Ihrer Bildschirmsitzung herstellen. Nach dem Anhängen mitscreen -r
können Sie die Umgebung in Ihren vorhandenen Shells mit aktualisierenscreen_pullenv
. Die tmux-Funktionen bewirken dasselbe für tmux, einen anderen Terminal-Multiplexer ähnlich wie screen.quelle
screen_update
und sehen, wie Sie Variablen aus der screen / tmux-Sitzung in die aktuelle Shell ziehentmux_update
. Ich werde meine Antwort mit einer byobu-unabhängigen Version aktualisieren.setenv
sehe ich, wie es besser ist. Aus dem Code, mit dem Sie verlinkt haben, war dies nicht ersichtlich. Danke noch einmal!Dies ist wahrscheinlich eine einfachere Lösung (Sie entscheiden). Der wichtige Teil ist der Alias, der die
savedisplay
Funktion jedes Mal aufruft, wenn einscreen
Befehl ausgeführt wird. Die Befehle werden nicht automatisch ausgeführt und können daher~/.bashrc
anstelle von sehr speziellen Befehlen eingegeben werden~/.ssh/rc
.quelle