Korzystam z systemu Linux i lubię wykonywać całą pracę z wierszem poleceń w ramach sesji jednego ekranu, aby móc ponownie uruchomić logowanie graficzne i tym podobne, bez utraty terminali. Jednak wylogowanie i powrót do sesji graficznej powoduje zmianę wszystkich zmiennych środowiskowych sesji, takich jak sesje DBus. Oznacza to, że po ponownym zalogowaniu moja sesja screen ma teraz stare (i złe) zmienne środowiskowe. Więc teraz, kiedy próbuję uruchomić programy graficzne z sesji ekranowej, w najlepszym wypadku wysyłają ostrzeżenie o niemożności połączenia z magistralą sesji. W najgorszym przypadku nie zaczynają całkowicie.
Tak więc szukam sposobu na zmodyfikowanie zmiennych środowiskowych w działającej instancji screen, aby wszystkie później utworzone okna ekranowe odziedziczyły nowe zmienne środowiskowe. Czy jest na to sposób?
źródło
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.
Odpowiedzi:
Nie można uruchomić skryptu powłoki z
screen
sesji, ponieważ odziedziczy on stare środowisko. Możesz jednak nam pomóc, aby wprowadzić nowe zmienne środowiskowe do starej sesji ekranowej. Możesz wypełnić tę piątkę po rozpoczęciu sesji graficznej.Uruchom ten skrypt w tle przy logowaniu (zakończy się dopiero po odczytaniu z niego wszystkich zmiennych).
Teraz możesz czytać z FIFO, np. Dodaj tę funkcję do swojego
.bashrc
abyś mógł podczas swojej starej
screen
sesjiźródło
screen
. AFAIKscreen
nie ujawnia żadnych gniazd ani podobnych elementów do komunikacji z uruchomionymi sesjami z zewnątrz.screen
sesja ma już najnowsze zmienne środowiskoweW tym celu zaimplementowałem skrypt. Możesz go pobrać tutaj: https://github.com/DarwinAwardWinner/screen-sendenv
Po włożeniu
screen-sendenv.py
do$PATH
swojego pliku .bashrc możesz użyć następującego fragmentu kodu:Aby z niego skorzystać, po prostu uruchom
screen_pushenv
przed uruchomieniem,screen -r
aby ponownie dołączyć do sesji ekranu. Następnie, po dołączeniu za pomocąscreen -r
, możesz zaktualizować środowisko w swoich istniejących powłokach za pomocąscreen_pullenv
. Funkcje tmux osiągają to samo dla tmux, innego terminalowego multipleksera podobnego do screena.źródło
screen_update
itmux_update
. Zaktualizuję moją odpowiedź za pomocą niezależnej od byobu wersji.setenv
kiedy wspomniałeś , widzę, jak to jest lepsze. Nie było to oczywiste z kodu, z którym się łączyłeś. Dzięki jeszcze raz!Możesz wywołać
setenv
polecenie w celu interaktywnej zmiany zmiennych środowiskowych w procesie ekranowym, używając: Ctrl- A+:setenv
(Uwaga na:
znak, aby wprowadzić polecenie ekranowe.) Zostaniesz poproszony o podanie nazwy i wartości zmiennej środowiskowej.Zauważ, że (jak w przypadku innych odpowiedzi / komentarzy) wpływa to na proces (rodzicielski) ekranu, a zatem nowo utworzone sesje ekranu, ale nie na bieżącą sesję ekranu ani na żadne istniejące sesje ekranu.
Możesz podać nazwę i wartość zmiennej środowiskowej jednocześnie, jeśli chcesz: Ctrl- A+
:setenv DISPLAY :100
. Ustawi WYŚWIETLACZ na „: 100” dla nowych sesji ekranu.Aby usunąć zmienną środowiskową, możesz użyć „unsetenv” - np. Ctrl- A+
:unsetenv DISPLAY
źródło
Jest to prawdopodobnie prostsze rozwiązanie (decydujesz). Ważną częścią jest alias, który wywołuje
savedisplay
funkcję przy każdym uruchomieniuscreen
polecenia. Polecenia nie są uruchamiane automatycznie, dlatego można je wprowadzić~/.bashrc
zamiast czegoś bardzo specjalistycznego~/.ssh/rc
.źródło