Ustawienie zmiennej PATH w / etc / environment vs .profile

29

Gdzie jest preferowane miejsce do ustawienia PATH envvar?

~/.profile lub /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?

    
zadawane pkaramol 30.12.2016, 14:45
źródło

4 odpowiedzi

37

Podsumowanie:

  • Jeśli chcesz dodać ścieżkę (np. /your/additional/path ) do zmiennej PATH tylko dla bieżącego użytkownika, a nie dla wszystkich użytkowników twojego komputera, zwykle umieszczasz ją na końcu ~/.profile jak w jednym z tych dwóch przykładów:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

    Zwróć uwagę, że priorytety ścieżki są zstępujące od lewej do prawej, więc pierwsza ścieżka ma najwyższy priorytet. Jeśli dodasz ścieżkę po lewej stronie $PATH , uzyska ona najwyższy priorytet, a pliki wykonywalne w tej lokalizacji zastąpią wszystkie pozostałe. Jeśli dodasz ścieżkę po prawej stronie, będzie miała najniższy priorytet, a pliki wykonywalne z innych lokalizacji będą preferowane.

  • Jeśli jednak chcesz ustawić tę zmienną środowiskową dla wszystkich użytkowników, nadal nie zaleca się dotykania /etc/environment , ale tworzenie pliku o nazwie kończącej się na .sh w /etc/profile.d/ . Skrypt /etc/profile i wszystkie skrypty w /etc/profile.d są globalnym odpowiednikiem osobistego ~/.profile każdego użytkownika i są wykonywane jako zwykłe skrypty powłoki przez wszystkie powłoki podczas ich inicjowania.

Więcej szczegółów:

  • /etc/environment to ogólnosystemowy plik konfiguracyjny, co oznacza, że ​​jest używany przez wszystkich użytkowników. Jest własnością root , więc musisz być administratorem i użyć sudo , aby go zmodyfikować.

  • ~/.profile to jeden ze skryptów inicjalizujących własne 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 to globalne skrypty inicjujące, które są równoważne ~/.profile dla każdego użytkownika. Skrypty globalne są wykonywane przed skryptami specyficznymi dla użytkownika; a główny /etc/profile wykonuje wszystkie skrypty *.sh w /etc/profile.d/ tuż przed jego wyjściem.

  • Plik /etc/environment zwykle zawiera tylko ten wiersz:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    Ustawia zmienną PATH dla wszystkich użytkowników w systemie na tę domyślną wartość, która nie powinna być zmieniana w znaczący sposób. Przynajmniej nie powinieneś usuwać z niego żadnych ważnych ścieżek, takich jak /bin , /sbin , /usr/bin i /usr/sbin .

    Ten plik jest odczytywany jako jeden z pierwszych plików konfiguracyjnych przez każdą powłokę każdego użytkownika. Zauważ, że to nie jest to skrypt powłoki . Jest to po prostu plik konfiguracyjny, który jest w jakiś sposób przetwarzany i może zawierać tylko przypisania zmiennych środowiskowych!

  • Plik ~/.profile może zawierać wiele rzeczy, domyślnie zawiera między innymi sprawdzenie, czy istnieje katalog ~/bin i dodaje go do istniejącej zmiennej PATH użytkownika, tak jak to (w starszych wydaniach Ubuntu przed 16.04 - nowsze wersje dodają ją bezwarunkowo):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    Widzisz, że stara wartość PATH zostanie tutaj ponownie wykorzystana, a nowa ścieżka jest dołączana tylko na początku, zamiast nadpisywać wszystko. Jeśli chcesz ręcznie dodawać nowe ścieżki, zawsze powinieneś zawsze zachować starą wartość $PATH w nowym ciągu.

    Ten skrypt inicjalizacyjny jest odczytywany tylko przez powłoki użytkownika, do którego należy, ale jest inny warunek:

    # ~/.profile: executed by the command interpreter for login shells.
    # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
    # exists.
    

    Więc jeśli używasz domyślnej powłoki Bash, powinieneś się upewnić, że nie masz ~/.bash_profile lub ~/.bash_login , jeśli chcesz, aby zmiany w ~/.profile miały wpływ na twojego użytkownika.

Aby uzyskać pełne zrozumienie zmiennych środowiskowych, zobacz: link

Powiązane pytanie: różnica między plikiem bash.bashrc a plikiem / etc / environment

    
odpowiedział Byte Commander 30.12.2016, 15:10
źródło
15
  

Ta odpowiedź dotyczy głównie kolejności, w której zmienne środowiskowe, takie jak PATH , są przypisane , gdy są określone w różnych plikach konfiguracyjnych. Obejmuję również miejsce, w którym zazwyczaj należy je ustawiać, ale poniższa lista nie zawiera plików w kolejności, w jakiej należy rozważyć ich użycie. Aby uzyskać ogólne informacje na temat ustawiania PATH i innych zmiennych środowiskowych w Ubuntu, polecam również czytanie EnvironmentVariables i inne odpowiedzi na to pytanie.

Preferowane miejsce do ustawienia PATH zależy od użytkowników , dla których chcesz ustawić i kiedy i jak chcesz je ustawić. Częścią 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 dla tylko jednego użytkownika (np. Twojego konta), a nie dla całego systemu.

Jak AlexP mówi , PATH zmienna środowiskowa będzie miała wartość ostatnio przypisaną . W praktyce większość czasu ustawiania PATH , dodajesz starszą wartość PATH do nowej wartości, tak aby poprzednie wpisy zostały zachowane.

Zatem w praktyce, gdy PATH jest ustawiany 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ę do zmiennej PATH , powodując, że jej stara wartość jest dołączana do nowej.

Dlatego w efekcie pytasz o kolejność, w której włączane są ustawienia PATH w różnych plikach.

Typowe miejsca ogólnego przeznaczenia do ustawienia PATH są wymienione poniżej w kolejności, w jakiej zaczynają działać, gdy użytkownik się loguje, nie w kolejności, w jakiej zwykle powinieneś używać ich . Każde z wymienionych poniżej miejsc to rozsądny wybór do ustawienia PATH w niektórych sytuacjach , ale tylko kilka z nich to dobry wybór przez większość czasu.

Na liście poniżej zobaczysz nazwy katalogów, takie jak ~/.profile . Jeśli nie jesteś zaznajomiony z rozszerzeniem tyldy , ~/ odnosi się do katalog domowy bieżącego użytkownika. Głównie używam tej składni dla zwartości. 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 ten plik istnieje, który domyślnie to robi. W ten sposób najczęściej ustawia się zmienne środowiskowe dla wszystkich użytkowników.

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Jeśli musisz ustawić zmienne środowiskowe dla wszystkich kont użytkowników, a nie tylko dla konta użytkownika, wtedy modyfikowanie tego pliku jest prawdopodobnie najlepszym wyborem. Zalecam najpierw wykonać kopię zapasową. Jednym ze sposobów utworzenia kopii zapasowej tego pliku jest uruchomienie:

sudo cp /etc/environment /etc/environment.orig

Rozszerzenie .orig nie jest specjalnie wymagane - możesz czuć się dobrze, nazywając plik kopii zapasowej wszystkim, co nie jest mylące lub już jest używane. (Poza .orig , .old , .backup i .bak są wspólne.)

Możesz edytować ten plik w dowolny sposób edytując 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 włączania starej wartości zmiennej. Ale zwykle jest to niepotrzebne, ponieważ w większości przypadków ustawiasz zmienną środowiskową dla wszystkich użytkowników, edytując /etc/environment , a mimo to chcesz, aby była to jej wartość początkowa, gdy użytkownik się loguje. Użytkownik może następnie zmienić to, co chce. Zazwyczaj użytkownicy mogą to zrobić.

2. Dla wszystkich użytkowników: /etc/security/pam_env.conf

PAM odczytuje zmienne środowiskowe dla wszystkich użytkowników z /etc/security/pam_env.conf , określone za pomocą tej samej składni co w plikach ~/.pam_environment dla użytkownika (zobacz poniżej).

Gdy ta sama zmienna środowiskowa jest ustawiona zarówno w /etc/environment , jak i /etc/security/pam_env.conf , używana jest wartość w pam_env.conf - nawet jeśli ta wartość jest określona jako DEFAULT zamiast OVERRIDE .

Jednak, gdy zastępujesz linię w environment z jednym w pam_env.conf , możesz uwzględnić zawartość zastąpionej wartości. Zobacz sekcję poniżej .pam_environment , aby poznać szczegóły (ponieważ używa tej samej składni).

Zazwyczaj nie jest konieczne edytowanie pam_env.conf i powinieneś bardzo uważać, jeśli to zrobisz , ponieważ linia zniekształcona zazwyczaj uniemożliwia zalogowanie się wszystkim normalnym kontom użytkowników w ogóle! Na przykład domyślny pam_env.conf zawiera linie:

#PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

Jest to jeden z kilku przykładów. Jedną z rzeczy, którą ilustruje, jest podział zadania na wiele linii za pomocą \ .Załóżmy, że odkomentowaliśmy pierwszą linię, ale zapomnieliśmy odkomentować drugą linię:

PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

Nie rób tego!

Właśnie to przetestowałem przez przypadek i uniemożliwiło to zalogowanie się użytkownikom. Aby to naprawić, musiałem uruchomić system w trybie odzyskiwania i zmienić go z powrotem. (Na szczęście zrobiłem to na wirtualnej maszynie, której używam tylko do testowania rzeczy, więc nie sprawiło mi to żadnych kłopotów.)

3. Dla jednego użytkownika: .pam_environment w katalogu domowym użytkownika

Jednym ze sposobów ustawienia zmiennej środowiskowej dla pojedynczego użytkownika jest edycja (lub stworzenie) .pam_environment w swoim katalogu domowym. Wartości ustawione w tym pliku zastępują wartości ustawione w globalnym pliku /etc/environment .

.pam_environment nie jest częścią szkieletu plików, który jest kopiowany do folderu domowego użytkownika po początkowym utworzeniu konta użytkownika. Jeśli jednak utworzysz ten plik w swoim katalogu domowym, możesz go użyć do ustawienia zmiennych środowiskowych, takich jak PATH . W przeciwieństwie do /etc/environment (ale jak /etc/security/pam_env.conf ), pliki .pam_environment na użytkownika obsługują rozszerzanie starej wartości zmiennej środowiskowej na nową. Nie są to jednak skrypty powłoki i musisz użyć specjalnej składni, aby to osiągnąć, co różni się nieco od składni, której użyjesz w pliku takim jak .profile .

Na przykład, jeśli masz katalog bin2 w twoim katalogu domowym, który chciałeś dodać do końca PATH , możesz to zrobić, dodając tę ​​linię do .pam_environment :

PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2

Zobacz podsekcja ~/.pam_environment EnvironmentVariables (z którego powyższy przykład jest ściśle dostosowany), man pam_env i man pam_env.conf dla dalszych szczegółów.

Chociaż był kiedyś reklamowany jako preferowany sposób, w jaki użytkownicy Ubuntu mogą zmieniać lub dodawać zmienne środowiskowe i jest nadal uważany za rozsądny i możliwy do przyjęcia wybór, powinieneś zachować ostrożność podczas edycji .pam_environment . Podobnie jak w przypadku edycji do ogólnosystemowego /etc/security/pam_env.so (patrz wyżej), zniekształcona linia w pliku .pam_environment użytkownika uniemożliwi pomyślne logowanie. (Przetestowałem to - celowo tym razem.) Aby uzyskać informacje o tym, jak zalecenia mają ewoluował , zobacz Gunnar Hjalmarsson komentarze poniżej i ta dyskusja ubuntu-devel .

Taki błąd jest znacznie mniej poważny, ogólnie , niż źle sformułowany wiersz w pam_env.so , ponieważ dotyczy tylko jednego użytkownika. Jednak w przypadku desktopowego systemu Ubuntu z tylko jednym kontem użytkownika, które pozwala na logowanie, taki błąd podczas edycji .pam_environment będzie tak samo zły, jak błąd edytowania pam_env.so - jeśli jeszcze nie jesteś zalogowany, nie będzie można go naprawić bez uruchamiania w trybie odzyskiwania (lub z aktywnego USB, itp.).

(Jeśli masz inne konta użytkowników, możesz zalogować się jako inny użytkownik i rozwiązać problem. Nawet jeśli nie jest on administratorem i nie może% root_de% zrootować, może nadal uruchamiać sudo i być Konto guest nie może tego zrobić, ponieważ zabrania się używania su your-account do przyjmowania tożsamości innego użytkownika.)

4. Dla wszystkich użytkowników: su i pliki wewnątrz /etc/profile

Powłoki zgodne z Bourne (w tym /etc/profile.d/ , domyślna powłoka użytkownika w systemie Ubuntu) uruchamiają polecenia w bash po wywołaniu jako powłoka logowania.

Ubuntu /etc/profile kończy się na:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

To powoduje, że polecenia w dowolnym pliku w katalogu /etc/profile.d , którego nazwa kończy się na /etc/profile.d/ , również mają być uruchamiane.

Większość menedżerów wyświetlania powoduje, że polecenia w .sh (a więc również pliki w /etc/profile ) są uruchamiane również w przypadku logowania graficznego. Jednak nie wszyscy tak robią i jest to istotny argument przemawiający za skorzystaniem z udogodnień udostępnianych przez PAM (patrz wyżej) - chyba że nigdy nie będzie żadnych graficznych logowań do tego systemu, które mogą być na przykład, jeśli jest to serwer bez zainstalowanego GUI.

Tradycyjne jest ustawianie ogólnosystemowych zmiennych środowiskowych w /etc/profile.d , ale często nie jest to już najlepszy wybór. Jeśli nie możesz ustawić zmiennej środowiskowej w /etc/profile i musisz ustawić ją dla wszystkich użytkowników, to prawdopodobnie lepiej jest utworzyć nowy plik w /etc/environment niż edytować /etc/profile.d/ sam.Jednym z powodów jest to, że po uaktualnieniu Ubuntu może pojawić się nowy domyślny plik /etc/profile . W zależności od sposobu przeprowadzenia aktualizacji, stary plik (ze zmianami) będzie przechowywany, z wyjątkiem tego konkretnego zaktualizowanego pliku konfiguracyjnego, lub zostaniesz poproszony o obsłużenie tej sytuacji.

Kiedy ta sama zmienna środowiskowa jest ustawiona w /etc/profile i jeden lub więcej plików w /etc/profile , który jest wykonywany jako ostatni? Zależy to od tego, czy polecenia w /etc/profile.d je ustawiają pojawiają się przed lub po plikach z /etc/profile (z kodu, który cytowałem powyżej). Polecenia w profile.d są wykonywane w kolejności, w jakiej są wyświetlane.

/etc/profile to skrypt 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 pliku /etc/profile dla użytkownika (zobacz poniżej).

Jeśli musisz napisać kod, który decyduje , czy dodać konkretny katalog do ~/.profile (i zrobić to dla wszystkich użytkowników), nie będziesz mógł użyć PATH lub /etc/environment , aby to zrobić. Jest to prawdopodobnie główna sytuacja, w której lepiej jest użyć /etc/security/pam_env.conf lub /etc/profile zamiast.

5. Dla jednego użytkownika: /etc/profile.d/ w katalogu domowym użytkownika

Jeśli użytkownik ma .bash_profile , bash używa go zamiast ~/.bash_profile lub ~/.profile (patrz poniżej). Zwykle nie powinieneś mieć ~/.bash_login w swoim katalogu domowym.

Jeśli tak, zazwyczaj powinien zawierać polecenie, aby pobrać .bash_profile (np. ~/.profile ). W przeciwnym razie zawartość pliku . "$HOME/.profile" dla użytkownika nie jest w ogóle uruchomiona.

6. Dla jednego użytkownika: .profile w katalogu domowym użytkownika

Jeśli użytkownik ma .bash_login , bash używa go zamiast ~/.bash_login (patrz poniżej), chyba że istnieje ~/.profile , w takim przypadku żadne inne nie będą używane, chyba że pochodzą z "~ / .bash_login.

Podobnie jak w przypadku ~/.bash_profile , zazwyczaj nie powinieneś mieć pliku .bash_profile w swoim katalogu domowym.

7. Dla jednego użytkownika: .bash_login w katalogu domowym użytkownika.

Kiedy powłoka w stylu Bourne'a jest uruchamiana jako powłoka logowania, uruchamia polecenia w .profile (która zwykle zawiera polecenia, które powodują uruchomienie poleceń w plikach w /etc/profile - patrz wyżej). Następnie uruchamia polecenia w /etc/profile.d/ w katalogu domowym użytkownika. Ten plik jest oddzielny dla każdego użytkownika. (Bash faktycznie działa .profile lub .bash_profile , jeśli istnieją - ale dla użytkowników systemu Ubuntu te pliki rzadko powinny istnieć lub istnieją.) (Szczegóły powyżej i 6.2 Bash Startup Files w manual Bash .)

.bash_login jest więc głównym miejscem, w którym użytkownik może umieszczać komendy uruchamiane podczas logowania. Jest to tradycyjne miejsce, w którym możesz ustawić ~/.profile , ale ponieważ Ubuntu ma moduł pam_env i obsługuje PATH , powinieneś rozważyć jego użycie.

Podobnie jak w przypadku ~/.pam_environment , nie wszystkie menedżery wyświetlania uruchamiają ten plik w celu graficznego logowania, chociaż większość robi. To jest powód, by preferować /etc/profile do ustawiania zmiennych środowiskowych (tak jak można preferować ~/.pam_environment do /etc/environment ).

Możesz rozwinąć zmienne środowiskowe, w tym /etc/profile , gdy ustawisz PATH w PATH (patrz wyżej). Jeśli jednak chcesz ustawić .pam_environment w bardziej wyrafinowany sposób, możesz zamiast tego użyć PATH . W szczególności, jeśli chcesz sprawdzić, czy katalog istnieje za każdym razem, gdy użytkownik się loguje i dodaje go tylko do .profile , wówczas nie będzie można użyć pliku PATH , aby dodać ten katalog do swojego .pam_environment .

Na przykład domyślny plik% PATH w systemie Ubuntu , którego użyto do , kończy się na:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Zobacz Gunnara Hjalmarssona komentarz w witrynie Bajt Odpowiedź dowódcy dla szczegółów.

Sprawdza, czy masz podkatalog .profile twojego katalogu domowego. Jeśli tak, dodaje ten podkatalog do początku twojego bin .

Ta lista pomija niektóre możliwości.

Istnieją inne sposoby ustawiania zmiennych środowiskowych podczas logowania, które zależą bardziej od typu logowania. Na przykład czasami możesz mieć zmienne środowiskowe, które są ustawione tylko dla logicznych loginów lub tylko dla zdalnych logowań opartych 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 PATH i ~/.bashrc , ponieważ nie są one ogólnie zalecane do ustawiania /etc/bash.bashrc i rzadko jest tak, że należy ich używać do ten cel. Jeśli użyjesz tych plików do dodania katalogów do PATH , to będą one czasami dodawane wiele razy i jest bardzo mylące, gdy sprawdzasz PATH . (W skrajnych przypadkach może to spowolnić działanie, ale zwykle jest to kwestia zachowania wszystkiego w czystości i zrozumiałości.)

Ponieważ $PATH jest domyślną powłoką logowania Ubuntu dla użytkowników, a większość użytkowników używa jej lub innej powłoki zgodnej z POSIX, pominąłem informacje o tym, jak zmienne środowiskowe są ustawione w innych powłokach nie będących Bourne, takich jak bash .

    
odpowiedział Eliah Kagan 30.12.2016, 19:30
źródło
3

/ etc / environment plik nie jest plikiem skryptowym, którego nie można użyć do eksportu i nie obsługuje rozszerzenia zmiennej typu $ HOME, tylko pary simplevariable = value. Aby użyć tego pliku, musisz po prostu dołączyć ścieżkę do istniejącej definicji, jest ona przeznaczona specjalnie dla ogólnosystemowych ustawień zmiennych środowiskowych. po jednym na linię. W szczególności plik ten przechowuje ogólnosystemowe ustawienia ustawień narodowych i ścieżek.

~ / .profile - ten plik jest wykonywany zawsze, gdy wykonywana jest powłoka powłoki bash, zwykle jest zalecany dla zmiennych środowiskowych, jednak ma tę wadę, że jest wywoływany tylko przez powłoki logowania, więc w aby to osiągnąć, musisz się wylogować i wrócić - lub przynajmniej rozpocząć nową powłokę logowania.

    
odpowiedział eGhoul 30.12.2016, 15:07
źródło
1

Preferowane miejsce ustawienia zmiennych środowiskowych zależy od kilku rzeczy:

  1. Czy jako jedyny korzystasz z komputera:
    • W tym przypadku najlepszym miejscem do ustawienia byłoby /etc/environment , ponieważ nie ma niebezpieczeństwa nieautoryzowanego dostępu.
  2. Jeśli system jest używany przez wielu
    • Jeśli zmienne powinny być dostępne dla wszystkich, lokalizacja będzie miała wartość /etc/environment , ale
    • Jeśli poszczególni użytkownicy powinni mieć wybrany dostęp do nich, to każdy powinien ustawić ich w ~/.profile odnoszących się do każdego użytkownika systemu, ponieważ znajduje się on w każdym domu użytkownika katalog.

System odczyta /etc/environment przed odczytaniem ~/.profile . Nie ma konkatenacji i jak Alex P powiedział, że ostatnie przydział do ścieżki ma pierwszeństwo.

Bardziej szczegółowe spojrzenie na czynniki decydujące o tym, jak ~/.profile i /etc/environment gra z innymi takimi lokalizacjami, przejdź do tutaj i tutaj , ponieważ czynniki te będą miały wpływ na sposób korzystania z tych lokalizacji.

    
odpowiedział George Udosen 30.12.2016, 15:10
źródło

Przeczytaj inne pytania na temat tagów