Gdzie jest preferowane miejsce na ustawienie PATH
envvar?
~/.profile
czy /etc/environment
?
Co się dzieje, gdy PATH
jest ustawiony w obu miejscach? Czy wynik końcowy jest połączeniem obu wartości ustalonych w tych dwóch miejscach?
environment-variables
paths
pkaramol
źródło
źródło
Odpowiedzi:
Podsumowanie:
Jeśli chcesz dodać ścieżkę (np.
/your/additional/path
) DoPATH
zmiennej tylko dla bieżącego użytkownika, a nie dla wszystkich użytkowników komputera, zwykle umieszczasz ją na końcu~/.profile
jak w jednym z tych dwóch przykładów:Zauważ, że priorytety ścieżki maleją od lewej do prawej, więc pierwsza ścieżka ma najwyższy priorytet. Jeśli dodasz ścieżkę po lewej stronie
$PATH
, będzie miała najwyższy priorytet, a pliki wykonywalne w tej lokalizacji zastąpią wszystkie inne. Jeśli dodasz swoją ścieżkę po prawej, będzie miała najniższy priorytet i preferowane będą pliki wykonywalne z innych lokalizacji.Jeśli jednak musisz ustawić tę zmienną środowiskową dla wszystkich użytkowników, nadal nie zalecałbym dotykania,
/etc/environment
ale utworzenie pliku o nazwie kończącej się.sh
na/etc/profile.d/
./etc/profile
Skrypt i wszystkie skrypty/etc/profile.d
są globalny odpowiednik każdy użytkownik osobista~/.profile
i wykonane jako zwykłe skrypty powłoki przez wszystkie skorupy podczas inicjalizacji.Więcej szczegółów:
/etc/environment
to ogólnosystemowy plik konfiguracyjny, co oznacza, że jest używany przez wszystkich użytkowników. Jest jednak własnościąroot
, więc musisz być administratorem isudo
modyfikować go.~/.profile
jest jednym z osobistych skryptów inicjujących powłoki użytkownika. Każdy użytkownik ma jeden i może edytować swój plik bez wpływu na innych./etc/profile
i/etc/profile.d/*.sh
są to globalne skrypty inicjujące, które są równoważne~/.profile
dla każdego użytkownika. Skrypty globalne są jednak wykonywane przed skryptami specyficznymi dla użytkownika; a main/etc/profile
wykonuje wszystkie*.sh
skrypty/etc/profile.d/
tuż przed wyjściem./etc/environment
Plik zawiera zwykle tylko ten wiersz:Ustawia
PATH
zmienną dla wszystkich użytkowników w systemie na tę wartość domyślną, której nie należy zmieniać w znaczący sposób. Przynajmniej nie należy usuwać żadnych istotnych ścieżek, takich jak/bin
,/sbin
,/usr/bin
i/usr/sbin
od niego.Ten plik jest odczytywany jako jeden z pierwszych plików konfiguracyjnych przez każdą powłokę każdego użytkownika. Zauważ, że nie jest to skrypt powłoki . To tylko plik konfiguracyjny, który w jakiś sposób jest analizowany i który może zawierać tylko przypisania zmiennych środowiskowych!
~/.profile
Plik może zawierać wiele rzeczy, domyślnie zawiera pośród innych rzeczy do sprawdzenia, czy~/bin
katalog istnieje i dodaje, że do istniejącego użytkownikaPATH
zmiennej, tak (na starszych wydaniach Ubuntu przed 16.04 - nowsze wersje dodać go bezwarunkowo):Widzisz, że stara wartość
PATH
tutaj zostaje ponownie użyta, a nowa ścieżka jest dołączana tylko na początku, zamiast zastępować wszystko. Kiedy chcesz ręcznie dodać nowe ścieżki, zawsze powinieneś zachować starą$PATH
wartość gdzieś w nowym ciągu.Ten skrypt inicjalizacyjny jest odczytywany tylko przez powłoki użytkownika, do którego należy, ale jest jeszcze jeden warunek:
Więc jeśli używasz domyślnej powłoki Bash, powinieneś upewnić się, że nie masz
~/.bash_profile
lub~/.bash_login
jeśli chcesz, aby zmiany~/.profile
miały wpływ na użytkownika.Pełne zrozumienie zmiennych środowiskowych można znaleźć na stronie : https://help.ubuntu.com/community/EnvironmentVariables
Powiązane pytanie: różnica między plikiem bash.bashrc i plikiem / etc / environment
źródło
~/.profile
nie sprawdza istnienia~/bin
, ale po prostu ma linię:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
w 16.04 ma wiersz, o którym wspomniałem. Najwyraźniej utworzyłeś użytkownika w poprzedniej wersji.~/.profile
też to mam, ale masz rację -/etc/skel/.profile
nie ma go w moim zaktualizowanym systemie 16.04 (i konto użytkownika utworzone podczas instalacji 16.04 na inna maszyna tego nie ma.profile
).Preferowane miejsce do ustawienia
PATH
zależy od użytkowników, dla których należy go ustawić oraz kiedy i jak chcesz to ustawić. Częścią Twojej decyzji będzie to, czy chcesz ustawić zmienną środowiskową dla wszystkich użytkowników, czy dla poszczególnych użytkowników. Jeśli nie masz pewności, zalecamy ustawienie go tylko dla jednego użytkownika (np. Konta), a nie całego systemu.Jak mówi AlexP ,
PATH
zmienna środowiskowa będzie miała wartość, którą została ostatnio przypisana . W praktyce przez większość czasu, który ustawiłeśPATH
, dołączasz starą wartośćPATH
do nowej wartości, aby poprzednie wpisy zostały zachowane.Dlatego w praktyce, gdy
PATH
jest ustawiony z wielu plików, zwykle zawiera wpisy podane we wszystkich plikach. Ale dzieje się tak tylko dlatego, że wszystkie pliki, które ją ustawiają, z wyjątkiem pierwszego, zwykle odwołują się doPATH
samej zmiennej, powodując włączenie jej starej wartości do nowej.Dlatego w rzeczywistości pytasz o kolejność, w jakiej obowiązują
PATH
ustawienia w różnych plikach.Typowe miejsca ogólnego przeznaczenia, które należy ustawić,
PATH
są wymienione poniżej w kolejności, w której obowiązują one po zalogowaniu się użytkownika, a nie w kolejności, w której zwykle należy rozważyć ich użycie . Każde z wymienionych poniżej miejsc jest rozsądnym wyborem do ustawieniaPATH
w niektórych sytuacjach , ale tylko niektóre z nich są dobrym wyborem przez większość czasu.Na poniższej liście zobaczysz niektóre nazwy katalogów, takie jak
~/.profile
. Jeśli nie jesteś zaznajomiony z rozszerzeniem tyldy ,~/
odwołuje się do katalogu domowego bieżącego użytkownika. Głównie używam tej składni ze względu na zwartość. Jest obsługiwany w skryptach powłoki, ale nie w plikach konfiguracyjnych PAM.1. Dla wszystkich użytkowników:
/etc/environment
PAM na Ubuntu powoduje ustawienie zmiennych środowiskowych wymienionych w
/etc/environment
, jeśli plik istnieje, co domyślnie tak jest. W ten sposób najczęściej ustawiane są zmienne środowiskowe dla wszystkich użytkowników.Jeśli musisz ustawić zmienne środowiskowe dla wszystkich kont użytkowników, a nie tylko dla konta użytkownika, to modyfikacja tego pliku jest prawdopodobnie najlepszym wyborem. Najpierw zalecamy wykonanie kopii zapasowej. Jednym ze sposobów utworzenia kopii zapasowej tego pliku jest uruchomienie:
.orig
Rozszerzenie nie jest specjalnie potrzebne - można czuć się dobrze o nazwanie pliku kopii zapasowej wszystko co nie jest mylące lub już używany. (Zresztą.orig
,.old
,.backup
i.bak
są wspólne.)Można edytować ten plik w dowolny sposób można edytować dowolny inny plik jako użytkownik root (
sudoedit /etc/enviromnment
,sudo nano -w /etc/environment
,gksudo gedit /etc/environment
, itd.)/etc/environment
nie obsługuje automatycznego dołączania starej wartości zmiennej. Ale zwykle nie jest to konieczne, ponieważ przez większość czasu ustawiasz zmienną środowiskową dla wszystkich użytkowników, edytując/etc/environment
, chciałbyś, aby była to początkowa wartość, gdy użytkownik się loguje. Użytkownik może następnie zmienić to, co chce. Zwykle dobrze jest, aby użytkownicy mogli to zrobić.2. Dla wszystkich użytkowników:
/etc/security/pam_env.conf
PAM odczytuje zmienne środowiskowe dla wszystkich użytkowników
/etc/security/pam_env.conf
, określone za pomocą tej samej składni, co w~/.pam_environment
plikach na użytkownika (patrz poniżej).Gdy ta sama zmienna środowiskowa jest ustawiona zarówno w, jak
/etc/environment
i/etc/security/pam_env.conf
,pam_env.conf
używana jest wartość in - nawet jeśli ta wartość jest podana jakoDEFAULT
zamiastOVERRIDE
.Jednak po zastąpieniu linii
environment
jednym z nichpam_env.conf
można dołączyć zawartość zastąpionej wartości. Szczegółowe informacje można znaleźć w poniższej sekcji.pam_environment
(ponieważ używa tej samej składni).Zazwyczaj edycja nie jest konieczna
pam_env.conf
i powinieneś być bardzo ostrożny , ponieważ zniekształcona linia zwykle uniemożliwia zalogowanie się wszystkim zwykłym kontom użytkowników! Na przykład domyślnapam_env.conf
zawiera linie:Jest to przedstawione jako jeden z kilku przykładów. Jedną z rzeczy, które ilustruje, jest podział zadania na wiele linii
\
. Załóżmy, że odkomentowałeś tylko pierwszą linię, ale zapomniałeś odkomentować drugą linię:Nie rób tego!
Właśnie to przetestowałem przez przypadek i uniemożliwiło to pomyślne zalogowanie się użytkowników. Aby to naprawić, musiałem uruchomić komputer w trybie odzyskiwania i zmienić go z powrotem. (Na szczęście zrobiłem to na maszynie wirtualnej, której używam tylko do testowania rzeczy, więc nie sprawiło mi to żadnych problemów).
3. Dla jednego użytkownika:
.pam_environment
w katalogu osobistym użytkownikaJednym ze sposobów ustawienia zmiennej środowiskowej dla pojedynczego użytkownika jest edytowanie (lub tworzenie)
.pam_environment
tego katalogu w tym katalogu domowym. Wartości ustawione w tym pliku zastępują wartości ustawione w/etc/environment
pliku globalnym ..pam_environment
nie jest częścią szkieletu plików, który jest kopiowany do folderu domowego użytkownika, gdy konto użytkownika jest początkowo tworzone. Jeśli jednak utworzysz ten plik w katalogu domowym, możesz go użyć do ustawienia zmiennych środowiskowych, takich jakPATH
. W przeciwieństwie do/etc/environment
(ale jak/etc/security/pam_env.conf
),.pam_environment
pliki na użytkownika obsługują rozszerzanie starej wartości zmiennej środowiskowej na nową. Nie są to jednak skrypty powłoki i aby to osiągnąć, musisz użyć specjalnej składni, która różni się nieco od składni, której użyłbyś w pliku takim jak.profile
.Na przykład, jeśli masz
bin2
katalog w swoim katalogu domowym, który chcesz dodać na końcuPATH
, możesz to zrobić, dodając ten wiersz do.pam_environment
:Patrz na
~/.pam_environment
podsekcję z EnvironmentVariables (z których w powyższym przykładzie jest ściśle dostosowaną)man pam_env
, aman pam_env.conf
dalsze szczegóły.Chociaż był to kiedyś reklamowany jako preferowany sposób zmiany lub dodania zmiennych środowiskowych przez użytkowników Ubuntu i nadal jest uważany za rozsądny i akceptowalny wybór, należy zachować ostrożność podczas edycji
.pam_environment
. Podobnie jak zmiany w całym systemie/etc/security/pam_env.conf
(patrz wyżej), zniekształcona linia w.pam_environment
pliku użytkownika uniemożliwi pomyślne logowanie. (Ja testowałem to. - celowo ten czas) Aby uzyskać informacje na temat zalecenia zostały ewoluowały , zobacz Gunnar Hjalmarsson „s komentarze poniżej i taubuntu-devel
dyskusja .Taki błąd jest ogólnie znacznie mniej poważny niż zniekształcona linia
pam_env.conf
, ponieważ dotyczy tylko jednego użytkownika. Jednak w przypadku stacjonarnego systemu Ubuntu z tylko jednym kontem użytkownika, które umożliwia logowanie, taki błąd podczas edycji.pam_environment
będzie tak samo zły jak edycja błędnapam_env.conf
- jeśli nie jesteś jeszcze zalogowany, nie będziesz w stanie naprawić to bez uruchamiania w trybie odzyskiwania (lub z USB na żywo itp.).(Jeśli masz inne konta użytkowników, możesz zalogować się jako inny użytkownik i naprawić problem. Nawet jeśli nie są oni administratorami i nie mogą
sudo
rootować, mogą nadal działać i zostać poproszony o podanie Twojego (nie własnego) hasła . na gość konto, jednak nie może tego zrobić, ponieważ jest zakaz wykorzystywania do przyjęcia tożsamości innego użytkownika).su your-account
su
4. Dla wszystkich użytkowników:
/etc/profile
i plików w środku/etc/profile.d/
Powłoki kompatybilne z Bourne (w tym
bash
domyślna powłoka użytkownika w Ubuntu) uruchamiają polecenia,/etc/profile
gdy są wywoływane jako powłoka logowania.Ubuntu
/etc/profile.d
kończy się na:Powoduje to również uruchomienie poleceń z dowolnego pliku w
/etc/profile.d/
katalogu, którego nazwa kończy.sh
się na.Większość menedżerów wyświetlania powoduje, że polecenia w
/etc/profile
(a zatem i pliki w/etc/profile.d
) są uruchamiane również w celu logowania graficznego. Jednak nie wszyscy tak robią, a to znaczący argument na korzyść korzystania z udogodnień udostępnianych przez PAM (patrz wyżej) - chyba że nigdy nie będzie żadnych graficznych loginów do tego systemu, co może mieć miejsce na przykład, jeśli jest to serwer bez zainstalowanego GUI.Tradycyjnie ustawia się systemowe zmienne środowiskowe
/etc/profile
, ale często nie jest to już najlepszy wybór. Jeśli nie możesz ustawić zmiennej środowiskowej/etc/environment
i musisz ją ustawić dla wszystkich użytkowników, prawdopodobnie lepiej jest utworzyć nowy plik/etc/profile.d/
niż edytować/etc/profile
. Jednym z powodów jest to, że po aktualizacji Ubuntu może pojawić się nowy/etc/profile
plik domyślny . W zależności od tego, w jaki sposób wykonasz aktualizację, albo stary plik (ze zmianami) zostanie zachowany, z pominięciem tego konkretnego zaktualizowanego pliku konfiguracyjnego, lub zostaniesz poproszony o obsługę sytuacji.Kiedy ta sama zmienna środowiskowa jest ustawiona zarówno w
/etc/profile
jednym, jak i w jednym lub większej liczbie plików/etc/profile.d
, co jest wykonywane jako ostatnie? Zależy to od tego, czy polecenia w/etc/profile
tym zestawie pojawiają się przed, czy po źródłach plikówprofile.d
(według kodu, który cytowałem powyżej). Polecenia w/etc/profile
są wykonywane w kolejności, w jakiej się pojawiają./etc/profile
jest skryptem powłoki, a jego składnia nie jest taka sama jak w przypadku plików konfiguracyjnych PAM omówionych powyżej . Jego składnia jest taka sama jak składnia~/.profile
pliku na użytkownika (patrz poniżej).Jeśli musisz napisać kod, który decyduje o tym, czy dodać konkretny katalog
PATH
(i zrobić to dla wszystkich użytkowników), nie będziesz w stanie tego użyć/etc/environment
ani/etc/security/pam_env.conf
zrobić. Jest to być może główna sytuacja, w której lepiej jest użyć/etc/profile
lub/etc/profile.d/
zamiast tego.5. Dla jednego użytkownika:
.bash_profile
w katalogu osobistym użytkownikaJeśli użytkownik ma
~/.bash_profile
, bash używa go zamiast~/.profile
lub~/.bash_login
(patrz poniżej). Zwykle nie powinieneś mieć.bash_profile
w swoim katalogu domowym.Jeśli to zrobisz, zwykle powinno zawierać polecenie do źródła
~/.profile
(np. "$HOME/.profile"
.). W przeciwnym razie zawartość.profile
pliku na użytkownika w ogóle nie zostanie uruchomiona.6. Dla jednego użytkownika:
.bash_login
w katalogu osobistym użytkownikaJeśli użytkownik tak
~/.bash_login
, bash używa go zamiast~/.profile
(patrz poniżej), chyba że~/.bash_profile
istnieje, w którym to przypadku żaden z pozostałych nie zostanie użyty, chyba że pochodzi z `~ / .bash_login.Tak jak w przypadku
.bash_profile
, zwykle nie powinieneś mieć.bash_login
pliku w swoim katalogu domowym.7. Dla jednego użytkownika:
.profile
w katalogu osobistym użytkownika.Gdy powłoka w stylu Bourne'a jest uruchamiana jako powłoka logowania, uruchamia polecenia w
/etc/profile
(co zwykle obejmuje polecenia, które powodują uruchomienie poleceń w plikach/etc/profile.d/
- patrz wyżej). Następnie uruchamia polecenia w.profile
katalogu osobistym użytkownika. Ten plik jest osobny dla każdego użytkownika. (Bash faktycznie działa.bash_profile
lub.bash_login
zamiast niego, jeśli istnieją - ale dla użytkowników systemu Ubuntu te pliki rzadko powinny istnieć. W celu uzyskania szczegółowych informacji patrz powyżej i Pliki startowe 6.2 Bash w instrukcji Bash .)~/.profile
jest zatem głównym miejscem, w którym użytkownik może umieszczać polecenia uruchamiane podczas logowania. Jest to tradycyjne miejsce do ustawieniaPATH
, ale ponieważ Ubuntu ma moduł pam_env i obsługuje~/.pam_environment
, powinieneś rozważyć jego użycie.Tak jak w przypadku
/etc/profile
nie wszystkich menedżerów wyświetlania uruchamiających ten plik w celu logowania graficznego, choć większość tak robi. Jest to powód, aby wolą~/.pam_environment
do ustawiania zmiennych środowiskowych (podobnie jak można woleć/etc/environment
do/etc/profile
).Można rozwinąć zmiennych środowiskowych, w tym
PATH
siebie, po ustawieniuPATH
w.pam_environment
(patrz wyżej). Jeśli jednak musisz ustawićPATH
bardziej wyrafinowany sposób, być może będziesz musiał użyć swojego.profile
. W szczególności, jeśli chcesz sprawdzić, czy katalog istnieje za każdym razem, gdy użytkownik się loguje, i dodać go tylko,PATH
jeśli tak, to nie będziesz mógł użyć swojego.pam_environment
pliku, aby dodać ten katalog do swojegoPATH
.Na przykład domyślny
.profile
plik użytkownika na Ubuntu używany do zakończenia:Zobacz Gunnar Hjalmarsson „s komentarz na odpowiedź bajt Komandorskim o szczegóły.
To sprawdza, czy masz
bin
podkatalog katalogu domowego. Jeśli tak, dodaje ten podkatalog na początku twojegoPATH
.Ta lista pomija pewne możliwości.
Istnieją inne sposoby ustawiania zmiennych środowiskowych, gdy użytkownicy się logują, które w większym stopniu zależą od typu logowania. Na przykład, czasami możesz mieć zmienne środowiskowe ustawiane tylko dla logowania graficznego lub tylko dla logowania zdalnego opartego na SSH. Powyższa lista nie obejmuje takich przypadków.
Pominąłem kilka plików, w których ludzie czasami definiują zmienne środowiskowe, takie jak
~/.bashrc
i/etc/bash.bashrc
, ponieważ nie są to ogólnie zalecane miejsca do ustawieniaPATH
i rzadko zdarza się, że należy ich używać do tego celu. Jeśli użyjesz tych plików do dodania katalogówPATH
, to czasami będą one dodawane wiele razy i jest bardzo mylące podczas przeglądania$PATH
. (W skrajnych przypadkach może to spowolnić, ale zwykle jest to kwestia utrzymania wszystkiego w czystości i zrozumiałości).Ponieważ
bash
jest to domyślna powłoka logowania Ubuntu dla użytkowników i większość użytkowników używa jej lub innej powłoki kompatybilnej z POSIX, pominąłem informacje o tym, jak zmienne środowiskowe są ustawiane w innych powłokach innych niż Bourne, takich jaktcsh
.źródło
/etc/environment
/~/.pam_environment
a do zalecanych plików. Po konsultacji z programistami zmieniłem go, aby był neutralny między PAM i/etc/profile.d/*.sh
/~/.profile
i nadal mam tendencję do patrzenia na to w ten sposób./etc/profile.d/*.sh
/~/.profile
są to, że składnia jest prostsza i że lightdm / gdm wybaczają w przypadku błędów (nawet błędy składniowe nie uniemożliwiają zalogowania się, ale po prostu powodują wyświetlanie komunikatów ostrzegawczych).pam_env.so
, miałeś na myślipam_env.conf
?pam_env.conf
. Dzięki! Zredagowałem to, aby to naprawić.Plik środowiskowy / etc / nie jest plikiem skryptu, którego nie można użyć do eksportowania i nie obsługuje on rozszerzania zmiennych typu $ HOME, tylko simplevariable = pary wartości. Aby więc użyć tego pliku, musisz po prostu dołączyć swoją ścieżkę do istniejącej definicji, przeznaczonej specjalnie dla ogólnosystemowych ustawień zmiennych środowiskowych. jeden na linię. W szczególności ten plik przechowuje ustawienia regionalne i ustawienia ścieżki w całym systemie.
~ / .profile - Plik ten jest wykonywany za każdym razem, gdy wykonywana jest powłoka bash, jest zwykle zalecana dla zmiennych środowiskowych, jednak ma tę wadę, że wywoływana jest tylko przez powłoki logowania, więc aby uzyskać efekt, będziesz potrzebować aby się wylogować i zalogować - a przynajmniej uruchomić nową powłokę logowania.
źródło
Preferowane miejsce do ustawiania zmiennych środowiskowych zależy od kilku rzeczy:
/etc/environment
nie ma niebezpieczeństwa nieupoważnionego dostępu./etc/environment
, ale~/.profile
dotyczące każdego użytkownika systemu, ponieważ znajduje się on w katalogu osobistym każdego użytkownika.System odczyta
/etc/environment
przed odczytem~/.profile
. Nie dochodzi do konkatenacji i podobnie jak Alex P powiedział, że ostatnie przypisanie do ścieżki ma pierwszeństwo.Aby uzyskać bardziej szczegółowe informacje na temat czynników, które określają, w jaki sposób
~/.profile
i/etc/environment
grać z innymi takimi lokalizacjami, przejdź tutaj i tutaj , ponieważ czynniki te będą miały wpływ na sposób korzystania z tych lokalizacji.źródło