Ustaw zmienne środowiskowe dla gnome na wayland i bash na wirtualnych terminalach (lub ssh)


13

Gnome 3.22 domyślnie używa Waylanda. Gnom na drodze nie czyta ~/.profile( ~/.bash_profileani nie /etc/profile). Zobacz https://bugzilla.gnome.org/show_bug.cgi?id=736660 .

Mam pliki inicjowania skonfigurowane w następujący sposób:

  • .bash_profilerobi nic oprócz źródła .profilei.bashrc
  • .profileustawia tylko zmienne środowiskowe, takie jak PATHiLC_MESSAGES
  • .bashrcustawia niektóre ustawienia i aliasy oraz zmienne środowiskowe specyficzne dla bash dla aplikacji takich jak lessi grep.

Efekt (przed waylandem) był następujący:

  • kiedy logowałem się graficznie .profilezostał odczytany i zmienne środowiskowe jak PATHi LC_MESSAGESzostały ustawione. kiedy otworzyłem bash w emulatorze terminala, wtedy .bashrczostał odczytany.
  • kiedy loguję się pod wirtualnym terminalem, .bash_profileczytałem, co z kolei czyta .profilei .bashrc.
  • kiedy loguję się za pomocą ssh, zachowanie jest podobne do wirtualnego terminala.

We wszystkich przypadkach .profilei .bashrcbyły czytane i moje środowisko została powołana.

Więc teraz gnome 3.22 używa waylanda, a wayland nie czyta .profile. Jak skonfigurować pliki inicjujące, aby ponownie uzyskać efekty opisane powyżej?

Pamiętaj, że nie nalegam, aby niektóre pliki (jak .profile) zostały odczytane. Chcę, aby moje środowisko było skonfigurowane w rozsądny sposób. Oznacza to, że chcę zachować określone ustawienia bash w plikach inicjujących bash, a inne ustawienia w innych plikach inicjujących. Chciałbym również nie kopiować ustawień dla różnych plików.

Używam arch Linux. Odpowiedzi na wszystkie dystrybucje są mile widziane. Sugerując obejście, opisz również skutki uboczne oraz zalety i wady.


Aktualizacja listopad 2017: O ile mi zrozumieć deweloperzy GNOME uznały, że ludzie oczekują swoje pliki konfiguracyjne (shell logowania .profileoraz .bash_profilew przypadku bash) są pozyskiwane po zalogowaniu. niezależnie od tekstu lub graficznego logowania. więc mój opisany powyżej przypadek użycia znów działa.

wciąż programiści gnome chcą odejść od uruchamiania powłoki logowania. wydaje się, że kierunek, w którym zmierzają, to użycie environmentd z systemd:

https://in.waw.pl/~zbyszek/blog/environmentd.html

Wydaje się, że minie trochę czasu, zanim wszystkie metody logowania zostaną dostosowane do środowiska.

Odpowiedzi:


7

Wersja systemowa 233 (marzec 2017 r.) Dodała obsługę ustawiania zmiennych środowiskowych w ~/.config/environment.d/*.conf. Zobacz stronę podręcznika environment.dman i dyskusję, która doprowadziła do pojawienia się tego wstępnego PR i ostatniego .


wydaje się to bardzo dobrym rozwiązaniem. zrobiłem szybki test. działa w gnome wayland, ale nie działa w wirtualnym terminalu. zakładam, że to również nie zadziała dla ssh. Przeczytałem stronę podręcznika, ale przeszukałem tylko dyskusje. masz jakiś pomysł, czy to zadziała również w wirtualnych terminalach i ssh?
lesmana

1
oto ładne podsumowanie sytuacji: in.waw.pl/~zbyszek/blog/environmentd.html . ostatni akapit mówi, że wsparcie dla terminala wirtualnego (i ssh?) „może” nadejść. przynajmniej jeśli dobrze to zrozumiałem.
lesmana

Och, ciekawe, nie zdawałem sobie sprawy, że GDM musiał dodać do tego specjalne wsparcie, aby działało. Czy mogło istnieć jakieś porozumienie, w którym wszystkie typy sesji są potomkami procesu obsługi pojedynczego użytkownika, który już przeanalizował te zmienne środowiskowe i wszystko działa po prostu bez potrzeby, aby GDM / sshd musieli coś o tym wiedzieć?
Jack O'Connor,

1
To nie działa dla mnie na Fedorze 30 z GDM / Wayland.
jonleighton

„Rozwiązanie” pomija uzasadniony przypadek użycia: jeśli A, to ustaw B. Jako jeden przykład, jeśli XDG_SESSION_TYPE = wayland, ustaw QT_QPA_PLATFORM = wayland.
vk5tu,

5

Oto obejście, którego używam dla tego samego problemu:

Krok 1

Utwórz skrypt źródłowy ~/.profilei spraw, aby skrypt był wykonywalny. Nazwijmy to /path/to/startup.sh. Może wyglądać mniej więcej tak:

#!/bin/bash
. ~/.profile

Krok 2

Utwórz aplikację komputerową, aby uruchomić skrypt. Aby to zrobić, musisz utworzyć .desktopplik i umieścić go w ~/.local/share/applications(lub /usr/share/applicationsjeśli chcesz, aby działał dla wszystkich użytkowników). Nazwijmy to ~/.local/share/applications/startup.desktop. Może wyglądać mniej więcej tak:

[Desktop Entry]
Name=Startup
Keywords=startup
Exec=/path/to/startup.sh
Type=Application

Aby uzyskać więcej informacji o .desktopplikach, zobacz tutaj .

Krok 3

Wyloguj. Zaloguj się ponownie. Teraz powinieneś być w stanie wyszukać swoją aplikację w menu aplikacji.

Krok 4

Ustaw tę aplikację jako aplikację startową. Aby to zrobić, użyłem narzędzia Gnome Tweak Tool i dodałem swoją aplikację do listy w zakładce Aplikacje startowe.

I to wszystko! Powinieneś teraz przywracać starą funkcjonalność przy każdym logowaniu. Zachowuje również nienaruszoną strukturę plików, więc gdy błąd w Wayland zostanie naprawiony, wszystko, co musisz zrobić, to usunąć aplikację z listy aplikacji startowych, usunąć dwa pliki i wszystko wróciło do normy.

Później edytuj

Jak wskazuje @Guss w komentarzach, to obejście nie wyeksportuje zmiennych środowiskowych, ponieważ startup.shjest uruchamiane we własnej powłoce. Potrzebujemy więc innego rozwiązania tego problemu.

Czytając z dokumentacji GNOME , możesz zobaczyć, że istnieje kilka alternatyw. Jedyne, co mogłem dostać do pracy, to utworzenie pliku /usr/share/gdm/env.d/i umieszczenie w nim zmiennych, które mają zostać wyeksportowane. Oznacza to jednak, że zmienne zostaną wyeksportowane dla wszystkich użytkowników, więc skończyłem tak:

Załóżmy, że mamy dwóch użytkowników, Johna i Sally . Dla każdego z nich utwórz plik /usr/share/gdm/env.d/, nazwijmy je startup_john.envi startup_sally.env. W tych plikach umieść zmienne środowiskowe, które mają zostać wyeksportowane po rozpoczęciu nowej sesji GNOME.

$ cat startup_john.env
VAR=1
$ cat startup_sally.env
VAR=2

W tym momencie problem polega na tym, że oba pliki zostaną załadowane dla obu użytkowników. Aby rozwiązać ten problem, ustawiamy uprawnienia do każdego pliku, tak aby tylko jego właściciel mógł czytać jego zawartość.

$ ls -l startup_john.env
-rw-r-----. 1 john john 4 Dec 27 15:17 startup_john.env
$ ls -l startup_sally.env
-rw-r-----. 1 sally sally 4 Dec 27 15:16 startup_sally.env

Zgadzam się, że nie jest to najbardziej eleganckie rozwiązanie, ale o ile testowałem, wydaje się, że wykonało to zadanie.


Nie przetestowałem tego, ale nie powinno to działać, ponieważ startup.shdziała ono w swojej własnej powłoce i nie eksportuje zmiennych środowiskowych do nadrzędnego kontekstu wykonania. Jako przykład, spróbuj uruchomić ten kod w swojej powłoce: echo "a is $a"; (export a="B"); echo "a is $a" . Według @Tudora, wyjście drugiego echa będzie a is B, co - zobaczysz po uruchomieniu kodu - nie jest tym, co się dzieje.
Guss

Cześć @Guss, masz rację. Nie zauważyłem tego, ale teraz, kiedy to zauważyłeś, znalazłem również obejście dla zmiennych środowiskowych. Odpowiednio zaktualizuję swoją odpowiedź.
Tudor Vișan

1
Proszę, chciałbym zobaczyć, co wymyśliłeś. Myślę też, że jesteś optymistą, kiedy mówisz „kiedy błąd w Wayland zostanie naprawiony” - to nie jest błąd w Wayland, ale w GNOME, a ludzie GNOME nie uważają tego za błąd - jest to udokumentowane zachowanie: wiki .gnome.org / Init inicjatyw / Wayland / SessionStart
Guss

Absolutnie szokujące, że wciąż nie jest to w jakiś sposób załatwione. Wszystko po to, by zdobyć mój .profile?!?
RichieHH
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.