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 jak su -c somecommand
i ssh 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.
- Pliki są analizowane linia po linii.
- Wiodące białe znaki są ignorowane.
- Opcjonalnie możesz rozpocząć linie od
export
i pojedynczą spacją (nie tabulatorem, idź do rysunku).
- Następnie każda linia musi mieć formę, w
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.
- Jeśli WARTOŚĆ zaczyna się od
'
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.
- Jeśli nie
=
, 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:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
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:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
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
:
emulate sh -c '. ~/.profile'
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ływany rshd
lub sshd
. Więc można rozpocząć ~/.bashrc
z
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh 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ład MY_ENVIRONMENT_HAS_BEEN_SET=yes
i sprawdź tę osłonę przed odczytaniem ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
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ć.