Pytanie mówi wszystko. Obecnie używam Arch Linux i zsh, ale chciałbym rozwiązania, które (przynajmniej) działa zarówno na VT, jak i xterms, a także (mam nadzieję, że najlepiej) będzie nadal działać, jeśli zmienię dystrybucje lub powłoki.
Słyszałem bardzo różne odpowiedzi na to pytanie w dokumentach różnych dystrybucji. Ubuntu mówi „użyj .pam_environment”. Myślę, że w Arch to, co zalecają, zależy od twojej powłoki. Obecnie umieszczam wszystko w .profile, a jeśli powłoka z jakiegoś powodu nie pobiera tego źródła (np. Bash, jeśli istnieje .bash_profile), zastępuję to, ręcznie go zdobywając. Ale wygląda na to, że musi być lepszy sposób.
shell
environment-variables
login
strugee
źródło
źródło
Odpowiedzi:
Niestety nie ma w pełni przenośnej lokalizacji do ustawiania zmiennych środowiskowych. Dwa najbliższe pliki
~/.profile
to tradycyjna lokalizacja i działa od razu po wyjęciu z pudełka wielu konfiguracji, a~/.pam_environment
także nowoczesna, powszechna, ale ograniczona alternatywa.Co włożyć
~/.pam_environment
Plik
~/.pam_environment
jest odczytywany przez wszystkie metody logowania, które używają PAM i które mają włączony ten plik. Dotyczy to obecnie większości systemów Linux.Główną zaletą
~/.pam_environment
jest to, że (po włączeniu) jest odczytywany przed uruchomieniem powłoki użytkownika, więc działa niezależnie od typu sesji, powłoki logowania i innych złożoności. Działa nawet w przypadku nieinteraktywnych loginów, takich jaksu -c somecommand
issh somecommand
.Głównym ograniczeniem
~/.pam_environment
jest to, że możesz umieszczać tam tylko proste zadania, a nie złożoną składnię powłoki. Składnia tego pliku jest następująca.export
i pojedynczą spacją (nie tabulatorem, idź do rysunku).VAR=VALUE
której VAR składa się z liter, cyfr i znaków podkreślenia.#
rozpoczyna komentarz, nie może pojawić się w wartości.'
lub"
zawiera inny identyczny cytat, wówczas VAR jest ustawiany na ciąg znaków między cytatami (wszystko po drugim cytacie jest ignorowane). W przeciwnym razie VAR jest ustawiany na ciąg znaków po=
znaku.=
, zmienna jest usuwana ze środowiska.Z drugiej strony
~/.pam_environment
działa w różnych okolicznościach. Z drugiej strony, nie można mieć żadnych ustawień dynamicznych, takich jak oparcie wartości zmiennej na innej zmiennej (np. Dodanie katalogu do PATH) lub użycie wyniku polecenia (np. Sprawdzenie, czy katalog lub program jest obecny), a niektóre Znaki (#'"
, nowa linia) są niemożliwe lub kłopotliwe do wprowadzenia wartości.Co włożyć
~/.profile
Ten plik powinien mieć przenośną składnię sh (POSIX). Używaj tylko rozszerzeń ksh lub bash (tablic
[[ … ]]
itp.), Jeśli wiesz, że twój system ma takie powłoki jako/bin/sh
.Ten plik może być odczytywany przez skrypty w automatycznych aplikacjach, więc nie powinien wywoływać programów, które generują dane wyjściowe lub wywołania
exec
. Jeśli chcesz to zrobić przy logowaniu w trybie tekstowym, zrób to tylko dla interaktywnych powłok. Przykład:Jest to przykład użycia
/bin/sh
jako powłoki logowania i przejścia do ulubionej powłoki. Zobacz także, w jaki sposób mogę użyć bash jako powłoki logowania, gdy mój administrator nie chce mi go zmienićKiedy
~/.profile
nie jest odczytywany przy graficznym logowaniu?Różne powłoki logowania odczytują różne pliki.
Jeśli twoja powłoka logowania jest bash
Bash czyta
~/.bash_login
lub~/.bash_profile
jeśli istnieją zamiast~/.profile
. Również bash nie czyta~/.bashrc
w powłoce logowania, nawet jeśli jest interaktywny. Aby nigdy więcej nie pamiętać tych dziwactw, utwórz~/.bash_profile
z następującymi dwoma wierszami:Zobacz także Których plików instalacyjnych należy użyć do konfigurowania zmiennych środowiskowych za pomocą bash?
Jeśli twoją powłoką logowania jest zsh
Zsh czyta
~/.zprofile
i~/.zlogin
, ale nie~/.profile
. Zsh ma inną składnię niż sh, ale może czytać~/.profile
w trybie emulacji sh. Możesz użyć tego do~/.zprofile
:Zobacz także Zsh nie uderza w ~ / .profile
Jeśli twoja powłoka logowania jest inną powłoką
Nie możesz wiele zdziałać - wystarczy użyć
/bin/sh
powłoki logowania, a ulubionej powłoki (np. Ryby) jako powłoki interaktywnej. Tak właśnie robię z Zsh. Zobacz wyżej przykład wywoływania innej powłoki z~/.profile
.Zdalne polecenia
Podczas wywoływania polecenia zdalnego bez przechodzenia przez interaktywną powłokę nie wszystkie powłoki odczytują plik startowy.
Ksh czyta plik określony przez
ENV
zmienną, jeśli uda ci się go przekazać.Bash czyta,
~/.bashrc
jeśli nie jest interaktywny (!), A jego proces nadrzędny jest wywoływanyrshd
lubsshd
. Więc można rozpocząć~/.bashrc
zZsh zawsze czyta,
~/.zshenv
kiedy się zaczyna. Używaj ostrożnie, ponieważ jest to odczytywane przez każdą pojedynczą instancję zsh, nawet jeśli jest to podpowłoka, w której ustawiono inne zmienne. Jeśli zsh jest twoją powłoką logowania i chcesz jej używać do ustawiania zmiennych tylko dla poleceń zdalnych, użyj osłony: ustaw jakąś zmienną~/.profile
, na przykładMY_ENVIRONMENT_HAS_BEEN_SET=yes
i sprawdź tę osłonę przed odczytaniem~/.profile
.Przypadek logowania graficznego
Wiele dystrybucji, menedżerów wyświetlania i środowisk pulpitu jest uruchamianych
~/.profile
przez jawne pozyskiwanie ich ze skryptów startowych lub uruchamianie powłoki logowania.Niestety, nie ma ogólnej metody obsługi kombinacji distro / DM / DE, gdzie
~/.profile
nie jest czytany.Jeśli korzystasz z tradycyjnej sesji rozpoczętej przez
~/.xsession
, jest to miejsce, w którym powinieneś ustawić swoje zmienne środowiskowe; zrób to przez pozyskiwanie~/.profile
(tj. ~/.profile
.). Zauważ, że w niektórych konfiguracjach skrypty startowe środowiska pulpitu będą się~/.profile
ponownie pobierać.źródło
case $- in *i*)
zrobić?;;
lubesac
), jeśli$-
pasuje do wzorca*i*
, tj. jeśli$-
zawierai
, tj. jeśli powłoka jest interaktywna.$-
jest ciągiem aktualnie ustawionych opcji powłoki. (jakset -x
).i
oznacza interaktywną powłokę.~/.config/env
, nawet bez emulacji?.profile
zgodność z dość starymi pociskami Bourne'a, ale zdaję sobie sprawę, że niektórym ludziom to po prostu nie obchodzi. Nie mam nic przeciwko ludziom, którzy zakładają, że sh = bash dla własnych plików, dbam tylko o to, czy opublikują#!/bin/sh
skrypt korzystający z funkcji bash.O ile mi wiadomo, nie ma żadnego standardu agnostycznego dla dystrybucji i powłoki, jak ustawić zmienne środowiskowe.
Najczęstszym i de facto standardem wydaje się być
/etc/profile
i~/.profile
. Drugim najczęściej występującym wydaje się być/etc/environment
i~/.pam_environment
.Wydaje mi się, że cała dokumentacja, którą znalazłem, już znalazłem. Wymieniam je tutaj dla pozostałych czytelników.
/etc/profile
i~/.profile
( link )./etc/environment
i~/.pam_environment
( link )./etc/profile
i/etc/environment
( link ).Bonus: tekst kwestionujący użycie i / lub niewłaściwe użycie
/etc/environment
w Debianie ( link , ostatnia aktualizacja 2008).źródło
sh
? Dopóki trzymasz się POSIX, myślałbym, że nic ci nie będzie ...csh
i znajomych w sposób POSIX (potrzebujesz czegoś takiego jakset
lubsetenv
)Dodałem następujący skrypt ~ / bin / agnostic_setenv:
A w ~ / .perl-homedir używam:
Podobny skrypt dla agnostic_unsetenv:
źródło