Setel variabel lingkungan untuk gnome di jalan dan bash di terminal virtual (atau ssh)

13

Gnome 3.22 menggunakan wayland secara default. Gnome di wayland tidak membaca ~/.profile(atau ~/.bash_profileatau /etc/profile). Lihat https://bugzilla.gnome.org/show_bug.cgi?id=736660 .

Saya mengatur file inisialisasi saya sebagai berikut:

  • .bash_profiletidak melakukan apa - apa selain sumber .profiledan.bashrc
  • .profilehanya menetapkan variabel lingkungan seperti PATHdanLC_MESSAGES
  • .bashrcset beberapa pengaturan spesifik bash dan alias dan variabel lingkungan untuk aplikasi seperti lessdan grep.

Efeknya (sebelum wayland) adalah sebagai berikut:

  • ketika saya login secara grafis .profilesudah dibaca dan variabel lingkungan suka PATHdan LC_MESSAGESditetapkan. ketika saya membuka bash di dalam terminal emulator kemudian .bashrcdibaca.
  • ketika saya login di bawah terminal virtual kemudian .bash_profiledibaca yang pada gilirannya membaca .profiledan .bashrc.
  • ketika saya login menggunakan ssh maka perilaku mirip dengan terminal virtual.

Dalam semua kasus .profiledan .bashrcdibaca dan lingkungan saya diatur.

Jadi sekarang gnome 3.22 menggunakan wayland dan wayland tidak membaca .profile. Bagaimana saya bisa mengatur file inisialisasi saya sehingga saya lagi memiliki efek seperti yang dijelaskan di atas?

Perhatikan bahwa saya tidak mendesak agar file tertentu (seperti .profile) dibaca. Yang saya inginkan adalah mengatur lingkungan saya dengan cara yang masuk akal. Itu berarti saya ingin menyimpan pengaturan spesifik bash ke file inisialisasi bash dan pengaturan lainnya ke file inisialisasi lainnya. Saya juga ingin tidak menyalin pengaturan pada file yang berbeda.

Saya menggunakan linux arch. Jawaban untuk semua distribusi diterima. Ketika menyarankan pemecahan masalah, harap jelaskan juga efek samping dan kelebihan dan kekurangannya.


update november 2017: sejauh yang saya mengerti pengembang gnome telah mengakui bahwa orang mengharapkan file konfigurasi shell login mereka ( .profiledan .bash_profiledalam kasus bash) bersumber setelah login. terlepas dari teks atau login grafis. jadi use case saya yang diuraikan di atas berfungsi lagi.

masih pengembang gnome ingin pindah dari memulai shell login. tampaknya arah yang mereka tuju adalah menggunakan environmentd dari systemd:

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

tampaknya perlu beberapa saat hingga semua metode login disesuaikan dengan lingkungan d.

lesmana
sumber

Jawaban:

7

Systemd versi 233 (Maret 2017) menambahkan dukungan untuk pengaturan variabel lingkungan di ~/.config/environment.d/*.conf. Lihat yang environment.dhalaman manual dan diskusi yang mengarah ke fitur pada PR awal ini dan satu akhir ini .

Jack O'Connor
sumber
ini tampaknya menjadi solusi yang sangat bagus. saya melakukan tes cepat. ia bekerja di gnome wayland tetapi tidak bekerja di terminal virtual. Saya menganggap itu juga tidak akan bekerja untuk ssh. Saya telah membaca halaman manual tetapi hanya membaca skim diskusi. apakah Anda tahu apakah ini juga akan bekerja di terminal virtual dan ssh?
lesmana
1
di sini adalah ringkasan situasi yang bagus: in.waw.pl/ ~ zbyszek / blog / environmentd.html . paragraf terakhir mengatakan bahwa dukungan untuk terminal virtual (dan ssh?) "mungkin" datang. setidaknya jika saya memahaminya dengan benar.
lesmana
Oh menarik, saya tidak menyadari bahwa GDM harus menambahkan dukungan khusus untuk membuatnya berfungsi. Mungkinkah ada semacam pengaturan di mana semua jenis sesi adalah anak-anak dari satu proses layanan pengguna tunggal, yang telah mem-parsing env vars ini, dan semuanya hanya bekerja tanpa GDM / sshd yang perlu tahu tentang hal itu?
Jack O'Connor
1
Ini tidak berfungsi untuk saya di Fedora 30 dengan GDM / Wayland.
jonleighton
'Solusi' meleset dari kasus penggunaan yang wajar: jika A, maka set B. Sebagai salah satu contoh, jika XDG_SESSION_TYPE = wayland lalu atur QT_QPA_PLATFORM = wayland.
vk5tu
5

Ini adalah solusi yang saya gunakan untuk masalah yang sama persis:

Langkah 1

Buat skrip yang sumbernya ~/.profiledan buat skrip itu bisa dieksekusi. Sebut saja /path/to/startup.sh. Itu bisa terlihat seperti ini:

#!/bin/bash
. ~/.profile

Langkah 2

Buat aplikasi desktop untuk menjalankan skrip. Untuk melakukan ini, Anda perlu membuat .desktopfile dan menempatkannya di ~/.local/share/applications(atau /usr/share/applicationsjika Anda ingin itu berfungsi untuk semua pengguna). Sebut saja ~/.local/share/applications/startup.desktop. Itu bisa terlihat seperti ini:

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

Untuk informasi lebih lanjut tentang .desktopfile lihat di sini .

Langkah 3

Keluar. Masuk kembali. Sekarang Anda dapat mencari aplikasi Anda di menu aplikasi.

Langkah 4

Tetapkan aplikasi ini sebagai aplikasi startup. Untuk melakukan ini, saya menggunakan Alat Gnome Tweak dan menambahkan aplikasi saya ke daftar di tab Aplikasi Startup.

Dan itu dia! Anda sekarang harus memiliki fungsionalitas lama Anda kembali setiap kali Anda login. Ini juga menjaga struktur file tetap utuh, jadi, ketika bug di Wayland diperbaiki, semua yang perlu Anda lakukan menghapus aplikasi dari daftar aplikasi startup, hapus dua file dan semuanya kembali normal.

Kemudian edit

Sebagaimana @Guss tunjukkan dalam komentar, solusi ini tidak akan mengekspor variabel lingkungan karena startup.shdijalankan di shellnya sendiri. Jadi kita perlu solusi lain untuk itu.

Membaca dari dokumentasi GNOME Anda dapat melihat bahwa ada beberapa alternatif. Satu-satunya yang saya bisa mulai bekerja adalah membuat file /usr/share/gdm/env.d/dan, dalam file itu, tempat variabel yang akan diekspor. Namun, ini berarti bahwa variabel akan diekspor untuk semua pengguna sehingga yang akhirnya saya lakukan adalah ini:

Katakanlah kita memiliki dua pengguna, john dan sally . Untuk masing-masing membuat file /usr/share/gdm/env.d/, mari kita panggil mereka startup_john.envdan startup_sally.env. Dalam file-file itu, tempatkan variabel lingkungan yang akan diekspor ketika mereka memulai sesi GNOME baru.

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

Pada titik ini masalahnya adalah bahwa kedua file akan dimuat untuk kedua pengguna. Untuk mengatasi ini, kami menetapkan izin pada setiap file sehingga hanya pemiliknya yang dapat membaca kontennya.

$ 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

Saya setuju, bukan solusi yang paling elegan, tetapi sejauh yang saya uji, tampaknya menyelesaikan pekerjaan.

Tudor Vansan
sumber
Saya belum menguji ini, tetapi seharusnya tidak berhasil karena startup.shsedang berjalan di shell sendiri dan tidak akan mengekspor variabel lingkungan ke konteks eksekusi induk. Sebagai contoh, coba jalankan kode ini di shell Anda: echo "a is $a"; (export a="B"); echo "a is $a" . Menurut @Tudor, output dari gema kedua adalah a is B, yang - Anda akan lihat ketika Anda menjalankan kode - bukan itu yang terjadi.
Guss
Hai @Guss, Anda benar. Saya tidak memperhatikan hal itu tetapi, sekarang setelah Anda menunjukkannya, saya menemukan solusi untuk variabel lingkungan juga. Saya akan memperbarui jawaban saya sesuai.
Tudor Vișan
1
Tolong lakukan, saya ingin melihat apa yang Anda buat. Juga, saya pikir Anda optimis ketika Anda mengatakan "ketika bug di Wayland diperbaiki" - ini bukan bug di Wayland tetapi di GNOME, dan orang-orang GNOME tidak menganggap ini bug - ini adalah perilaku yang didokumentasikan: wiki .gnome.org / Initiatives / Wayland / SessionStart
Guss