Jak na stałe ustawić $ PATH na Linux / Unix?


879

Próbuję dodać katalog do mojej ścieżki, aby zawsze znajdował się na mojej ścieżce systemu Linux. Próbowałem:

export PATH=$PATH:/path/to/dir

Działa to, jednak za każdym razem, gdy wychodzę z terminala i uruchamiam nową instancję terminala, ścieżka ta jest tracona i muszę ponownie uruchomić polecenie eksportu.

Jak mogę to zrobić, aby zostało to ustawione na stałe?

Odpowiedzi:


229

Można to zrobić na wiele sposobów. Rzeczywiste rozwiązanie zależy od celu.

Wartości zmiennych są zwykle przechowywane na liście przypisań lub w skrypcie powłoki uruchamianym na początku sesji systemowej lub użytkownika. W przypadku skryptu powłoki należy użyć określonej składni powłoki i / exportlub setpoleceń.

System szeroki

  1. /etc/environmentLista unikalnych zadań, pozwala na referencje. Idealny do dodawania katalogów systemowych jak /usr/local/something/bindo PATHzmiennej lub definiowania JAVA_HOME. Używany przez PAM i SystemD.
  2. /etc/environment.d/*.confLista unikalnych zadań, pozwala na referencje. Idealny do dodawania katalogów systemowych jak /usr/local/something/bindo PATHzmiennej lub definiowania JAVA_HOME. Konfigurację można podzielić na wiele plików, zwykle po jednym na każde narzędzie (Java, Go, NodeJS). Używany przez SystemD, który z założenia nie przekazuje tych wartości do powłok logowania użytkownika.
  3. /etc/xprofileSkrypt powłoki wykonywany podczas uruchamiania sesji X Window System. Jest to uruchamiane dla każdego użytkownika, który loguje się do X Window System. Jest to dobry wybór dla PATHwpisów, które są ważne dla każdego użytkownika, takiego jak /usr/local/something/bin. Plik jest zawarty w innym skrypcie, więc używaj składni powłoki POSIX, a nie składni powłoki użytkownika.
  4. /etc/profilei /etc/profile.d/*skrypt Shell. Jest to dobry wybór dla systemów tylko z powłoką. Pliki te są odczytywane tylko przez powłoki w trybie logowania.
  5. /etc/<shell>.<shell>rc. Skrypt powłoki. Jest to zły wybór, ponieważ jest specyficzny dla pojedynczej powłoki. Używany w trybie bez logowania.

Sesja użytkownika

  1. ~/.pam_environment. Lista unikalnych zadań, bez referencji. Ładowane przez PAM na początku każdej sesji użytkownika nie ma znaczenia, jeśli jest to sesja lub powłoka systemu X Window. Nie można odwoływać się inne zmienne łącznie HOMEalbo PATHtak ma ograniczone zastosowanie. Używany przez PAM.
  2. ~/.xprofileSkrypt powłoki. Jest to wykonywane, gdy użytkownik loguje się do systemu X Window System. Zdefiniowane tutaj zmienne są widoczne dla każdej aplikacji X. Idealny wybór dla powiększenia PATHo wartościach takich jak ~/binlub ~/go/binczy zdefiniowania konkretnego użytkownika GOPATHlub NPM_HOME. Plik jest zawarty w innym skrypcie, więc używaj składni powłoki POSIX, a nie składni powłoki użytkownika. Graficzny edytor tekstu lub IDE uruchomiony skrótem zobaczy te wartości.
  3. ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginSkrypt Shell. Będzie widoczny tylko dla programów uruchamianych z terminala lub emulatora terminala. Jest to dobry wybór dla systemów tylko z powłoką. Używany przez powłoki w trybie logowania.
  4. ~/.<shell>rc. Skrypt powłoki. Jest to zły wybór, ponieważ jest specyficzny dla pojedynczej powłoki. Używany przez powłoki w trybie bez logowania.

Notatki

Gnome na Wayland uruchamia powłokę logowania użytkownika, aby uzyskać środowisko. Skutecznie wykorzystuje konfiguracje powłoki logowania ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginpliki.

Instrukcje

  • środowisko
  • środowisko. d
  • grzmotnąć
  • dziarskość

Dokumentacja specyficzna dla dystrybucji

Związane z

Różnica między powłoką logowania a powłoką niezalogowaną?


4
Dziękuję za szczegółową odpowiedź, powinna być wyżej. Może również .bash_profilepowinien zostać dodany do listy?
James Ko

2
@JamesKo to był numer 4
trve.fa7ad

1
Myślę, że sugerowana jest najlepsza odpowiedź /etc/environment. Ale czy mogę go odświeżyć bez wylogowania i zalogowania? Czasami nie używam bash ani sh, więc source /etc/environmentnie działa.
banan3'14

2
Świetna i moim zdaniem najbardziej kompletna odpowiedź. Powinno być znacznie wyżej.
Peter Gloor

2
Moim powodem do poszukiwania tego tematu było Go. Cieszę się, że nie jestem jedynym, który zdał sobie sprawę, że .bashrc nie jest właściwym miejscem. ;)
Peter Gloor

1039

Musisz dodać go do pliku ~/.profilelub ~/.bashrcpliku. 

export PATH="$PATH:/path/to/dir"

W zależności od tego, co robisz, możesz również chcieć utworzyć dowiązanie symboliczne do plików binarnych:

cd /usr/bin
sudo ln -s /path/to/binary binary-name

Pamiętaj, że nie spowoduje to automatycznej aktualizacji Twojej ścieżki do końca sesji. Aby to zrobić, uruchom:

source ~/.profile 
or
source ~/.bashrc

11
Kilka pytań. 1) Czy nie powinno być dwukropka między $PATHa /usr/bin. 2) Powinien /usr/binnawet tam być. 3) Nie powinieneś raczej używać /usr/local/bin?
Batandwa

197
Uwaga : często uważa się, że dziura w zabezpieczeniach pozostawia końcowy dwukropek na końcu ŚCIEŻKI bash, ponieważ sprawia, że ​​bash szuka w bieżącym katalogu, jeśli nie może znaleźć wykonywalnego pliku, którego szuka. Użytkownicy, którzy znajdą ten post i szukają więcej informacji, powinni zostać o tym poinformowani.
erewok

51
@AdamRobertson Jest to niebezpieczne - weź pod uwagę scenariusz, w którym rozpakowujesz archiwum, a następnie cddo katalogu, w którym go rozpakowałeś, a następnie uruchom ls---, a następnie zdaj sobie sprawę, że w archiwum wywołano złośliwy program ls.
Lily Chung

21
Dla mnie był to .bash_profile, a nie .profile. Wydaje się, że dla każdego jest inaczej.
donquixote

9
Myślę, że znacznie poprawiłem jakość tej odpowiedzi i rozwiązałem kilka problemów poruszonych przez innych użytkowników. Każdy eksport ścieżki lub każde polecenie dostosowujące ścieżkę powinno zawsze pamiętać o oddzieleniu istniejącej ścieżki dwukropkiem. Wiodące lub końcowe dwukropki nigdy nie powinny być używane, a bieżący katalog nigdy nie powinien znajdować się na ścieżce.
Erick Robertson,

243

W Ubuntu edytuj /etc/environment. Jego jedynym celem jest przechowywanie zmiennych środowiskowych. Pierwotnie zmienna $ PATH jest tutaj zdefiniowana. To jest pasta z mojego /etc/environmentpliku:

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

Możesz więc otworzyć ten plik jako root i dodać co tylko chcesz.

Aby uzyskać natychmiastowe wyniki, uruchom (spróbuj jako zwykły użytkownik i root):

source /etc/environment && export PATH

AKTUALIZACJA:

Jeśli używasz zsh(aka Z Shell), dodaj tę linię zaraz po komentarzach w /etc/zsh/zshenv:

source /etc/environment

Zetknąłem się z tym małym dziwactwem na Ubuntu 15.10, ale jeśli twój zsh nie otrzymuje poprawnej ŚCIEŻKI , może to być powód


13
Nie wszystkie systemy mają / etc / environment
user3439968

9
FWIW $PATHjest również zdefiniowany /etc/profilew Arch Linux.
Sparhawk

3
@ e-sushi Jestem zszokowany. Sam jestem na Ubuntu 14.04.1. i mogę obiecać, że plik został wbudowany.
trve.fa7ad

2
Po wypróbowaniu wszystkich sugestii pod słońcem, ale / etc / environment i mając je wszystkie NIE działają, w końcu natknąłem się na to. Jestem również na Ubuntu 14.04 i to jest jedyna, która faktycznie zmieniła zmienną PATH po ponownym uruchomieniu.
Chockomonkey

4
Użytkownik powinien ponownie uruchomić komputer po aktualizacji pliku środowiska.
Harish_N

70

Umieść exportdeklarację w ~/.bashrc. Mój .bashrc zawiera to:

export PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH

7
potrzebny jest restart?
Kliknij Upvote

2
Zadziałało, gdy wstawiłem to do .profile„, nie znalazłem.bashrc
kliknij Upvote

Może to zależeć od dokładnego systemu; Nie jestem pewien, jakie dokładnie warunki określają, który plik jest wykonywany. Cieszę się, że problem został rozwiązany.
Fraxtil

12
@ Kliknij Upvote Musisz zrobić, source ~/.bashrcaby ponownie załadować .bashrckonfigurację. Wtedy to zadziała
BigSack,

4
Słowo exportkluczowe jest potrzebne tylko wtedy, gdy PATHnie jest już oznaczone jako zmienna środowiskowa - co będzie prawie bezwarunkowo. Po prostu PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATHmiałby ten sam efekt.
Charles Duffy

30

Możesz ustawić na $PATHstałe na 2 sposoby.

  1. Aby ustawić ścieżkę dla konkretnego użytkownika: Może być konieczne wprowadzenie wpisu w .bash_profilekatalogu osobistym użytkownika.

    np. w moim przypadku ustawię ścieżkę java w profilu użytkownika tomcat

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  2. Aby ustawić wspólną ścieżkę dla WSZYSTKICH użytkowników systemu, może być konieczne ustawienie ścieżki w następujący sposób:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile

3
Jest plik o nazwie /etc/profilesze związkiem sna swojej dystrybucji? Mój nie ma s. Myślę, że masz literówkę.
Chris Johnson

3
Prawdopodobnie chcesz uciec od $, który piszesz do pliku profilu. np. echo „eksport ŚCIEŻKA = \ $ ŚCIEŻKA: / ścieżka / do / katalog” >> / etc / profile, w ten sposób faktycznie dołączasz się do zmiennej, gdy skrypt działa, zamiast ustawiać jej literalną wartość na podstawie jego wartości czas wykonania tego polecenia początkowego.
BuvinJ

15

Możesz używać w Centos lub RHEL dla lokalnego użytkownika:

echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile

To doda bieżący katalog (lub możesz użyć innego katalogu) do ŚCIEŻKI, dzięki czemu będzie trwały, ale zacznie obowiązywać przy następnym logowaniu użytkownika.

Jeśli nie chcesz ponownie logować się, możesz użyć:

source ~/.bash_profile

Przeładuj # User specific environment and startup programsten komentarz jest obecny w.bash_profile


12

Możesz także ustawić na stałe, edytując jeden z tych plików:

/etc/profile (dla wszystkich użytkowników)

~/.bash_profile (dla bieżącego użytkownika)

~/.bash_login (dla bieżącego użytkownika)

~/.profile (dla bieżącego użytkownika)

Możesz także użyć /etc/environmentdo ustawienia stałej zmiennej środowiskowej PATH, ale nie obsługuje ona rozszerzania zmiennych .

Wyodrębniono z: http://www.sysadmit.com/2016/06/linux-anadir-ruta-al-path.html


7

Wczoraj natknąłem się na to pytanie, szukając sposobu, aby dodać folder zawierający moje własne skrypty do PATH - i byłem zaskoczony, gdy dowiedziałem się, że mój własny ~/.profileplik (na Linux Mint 18.1) już to zawierał:

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

Tak więc wszystko, co musiałem zrobić, to utworzyć folder ~/bini umieścić tam moje skrypty.


7

Myślę, że najbardziej eleganckim sposobem jest:

1. dodaj to w pliku ~ / .bashrc Uruchom to polecenie

gedit ~ / .bashrc

dodaj swoją ścieżkę

eksport PATH = $ PATH: / opt / node / bin

2. źródło ~ / .bashrc

(Ubuntu)


6

Możesz dodać tę linię do pliku konfiguracyjnego konsoli (np. .Bashrc) lub do .profile


2
Nie mam żadnego z tych plików w/home/(username)
Kliknij Upvote

3
@ClickUpvote: Jakiej powłoki używasz? (A pliki zaczynające się od kropki są ukryte, potrzebujesz czegoś, co ls -amożna je zobaczyć.)
David Schwartz

Ponieważ nie masz żadnego z tych plików (bashrc lub profil), możesz je ręcznie utworzyć i zostaną one automatycznie użyte
trve.fa7ad

4

Dodaj na stałe zmienną PATH

Światowy:

echo "export PATH=$PATH:/new/path/variable" >> /etc/profile

Lokalny (tylko dla użytkownika):

echo "export PATH=$PATH:/new/path/variable" >> ~/.profile

Do globalnego restartu. Do lokalnego ponownego logowania.

Przykład

Przed:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin

Po:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Możesz też po prostu edytować profil:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Inny sposób (dzięki gniourf_gniourf):

echo 'PATH=$PATH:/new/path/variable' >> /etc/profile

Nie powinieneś tutaj używać podwójnych cudzysłowów! echo 'export PATH = $ PATH: / new / path / variable' ... Nawiasem mówiąc, słowo kluczowe export jest bardzo bezużyteczne, ponieważ zmienna PATH jest już prawdopodobnie oznaczona jako wyeksportowana. - gniourf_gniourf


1
Nie. Nie powinieneś tutaj używać podwójnych cudzysłowów! echo 'export PATH=$PATH:/new/path/variable'... Nawiasem mówiąc, exportsłowo kluczowe jest prawdopodobnie bezużyteczne, ponieważ PATHzmienna jest już prawdopodobnie oznaczona jako wyeksportowana.
gniourf_gniourf

Nie, powinieneś używać podwójnych cudzysłowów, ponieważ $ PATH w pojedynczych cudzysłowach nie interpolowanych. Przydatny jest także eksport BTW.
user3439968

Mam to. Możesz użyć podwójnych cudzysłowów lub pojedynczych cudzysłowów, ponieważ $ PATH interpoluje podczas wykonywania echa lub interpoluje podczas wykonywania / etc / profile.
user3439968

1
@ user3439968 faktycznie, podwójne cudzysłowy spowodują wiele problemów, jeśli dodamy do $ PATH z wielu plików. Zastanów się: kiedy używasz podwójnych cudzysłowów, $ PATH zostaje przetłumaczony na ciąg statyczny ze wszystkimi wcześniej zdefiniowanymi katalogami PATH. powiedz, że dołączasz /usr/localdo niego za pomocą ~/.bashrc. teraz, jeśli zamierzasz dołączyć /opt/bindo tej samej zmiennej za pomocą /etc/bash.bashrc; $ PATH przełoży się na ten sam ciąg statyczny, w wyniku czego $ PATH zostanie zastąpione zamiast dołączone do ... Będzie to kwestia preferencji systemu względem jednego pliku nad drugim
trve.fa7ad

4

1. zmodyfikuj plik „/ etc / profile”.

#vi /etc/profile

Naciśnij klawisz „i”, aby wprowadzić status edycji i przesuń kursor na koniec pliku, dodatkowe wpisy :

export PATH=$PATH:/path/to/dir;

Naciśnij klawisz „Esc”, wyjdź ze stanu edycji, „: wq” zapisz plik.

2. Spraw, aby konfiguracja była skuteczna

source /etc/profile

Wyjaśnij file plik profilu działa dla wszystkich użytkowników, jeśli chcesz być ważny tylko dla aktywnego użytkownika, ustaw plik „.bashrc”


4

Po tak wielu badaniach znalazłem proste rozwiązanie tego problemu (używam elementarnego systemu operacyjnego ), zainspirowane poniższym linkiem .

Uruchom następujące polecenie, aby otworzyć plik .bashrc w trybie edycji . [Możesz także użyć vi lub dowolnego innego edytora].

~$ sudo nano ~/.bashrc

Dodaj następujący wiersz na końcu pliku i zapisz.

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"

Na przykład :

export PATH="/home/rageshl/dev/flutter/bin:$PATH"

wprowadź opis zdjęcia tutaj

Wierzę, że jest to trwałe rozwiązanie do ustawiania ścieżki w trzepotaniu w dystrybucji Ubuntu

Mam nadzieję, że to pomoże.


3

pliki, do których dodajesz polecenie eksportu, zależą od tego, czy jesteś w trybie logowania, czy bez logowania.

jeśli jesteś w trybie logowania, pliki, których szukasz, to / etc / bash lub /etc/bash.bashrc

jeśli jesteś w trybie bez logowania, szukasz pliku /.profile lub plików w katalogu /.profiles.d

pliki wymienione powyżej, jeśli są tam zmienne systemowe.


3

Dodaj do /etc/profile.dfolderu skryptu [name_of_script].shz linii: export PATH=$PATH:/dir. Każdy skrypt w /etc/profile.dfolderze jest wykonywany automatycznie /etc/profileprzy logowaniu.


Jest to zalecany sposób dostosowania środowiska
Yuriy,

1
Dzieje się tak tylko wtedy, gdy chcesz, aby ustawienia obejmowały cały system, co prawdopodobnie nie jest najczęstszym przypadkiem użycia. Większość ludzi chce (lub powinna chcieć) lokalną ścieżkę, ponieważ większość użytkowników / ról wykonuje kontekstowo różne operacje, a im mniej założeń, tym lepiej.
zasilany

@mpowered, tak, dotyczy to tylko całego systemu. Jeśli chcesz lokalnie zmienić PATH, powinieneś dodać ten sam eksport do ~ / .profile lub ~ / .bashrc. Tutaj powinieneś wziąć pod uwagę, że powłoki logowania czytają ~ / .profile, a powłoki interaktywne czytają ~ / .bashrc. Jest to bardzo ważne, ponieważ na przykład ssh nie loguje się, dlatego ~ / .profile nie zostanie odczytany. Kilka dystrybucji, takich jak suse source ~ / .bashrc w / etc / profile. Ale to nie jest wspólne dla wszystkich linux '
Yuriy

3

Zues77 ma właściwy pomysł. OP nie powiedział: „jak mogę włamać się przez to”. OP chciał wiedzieć, jak na stałe dołączyć do $ PATH:

sudo nano /etc/profile

Tutaj jest ustawiony na wszystko i jest to najlepsze miejsce, aby to zmienić na wszystkie rzeczy wymagające $ PATH


3

Moja odpowiedź jest w odniesieniu do zakładania go-langna Ubuntu linux/amd64.I napotkały ten sam problem ustawiania ścieżki zmiennych środowiskowych ( GOPATHi GOBIN), tracąc go na wyjściu zacisków i odbudowę go za pomocą source <file_name>wszelkich time.The błędem było umieścić ścieżkę ( GOPATHi GOBIN) w ~/.bash_profilefolderze. Po marnować kilka dobrych godzin, okazało się, że rozwiązaniem było umieszczenie GOPATHi GOBINw ~/.bash_rcpliku w sposób:

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH:$GOBIN

i dzięki temu instalacja go działała dobrze i nie było żadnych strat ścieżki.

EDYCJA 1: Powodem, dla którego ten problem może być związany, jest to, że ustawienia powłok niezalogowanych, takich jak terminal ubuntu lub gnome-terminal, w których uruchamiamy kod go, są pobierane z ~./bash_rcpliku, a ustawienia powłok logowania są pobierane z ~/.bash_profilepliku, i z ~/.profilepliku, jeśli ~/.bash_profileplik jest nieosiągalny.


3

Załóżmy, że używasz systemu MacOS i masz plik binarny, któremu ufasz i chciałbyś go udostępnić w całym systemie, ale niekoniecznie chcesz katalogu, w którym plik binarny ma zostać dodany do PATH, możesz wybrać opcję kopiowania / przenoszenia plik binarny do /usr/local/bin, który powinien już znajdować się w ŚCIEŻCE. Spowoduje to, że plik binarny będzie wykonywalny jak każdy inny plik binarny, do którego masz już dostęp w swoim terminalu.


3

Można go dodać bezpośrednio za pomocą następującego polecenia:

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc

2
Pytanie jest oznaczone bash, więc nie jest to bardzo pomocne.
Laurenz Albe,

2
To poprawna odpowiedź -> tytuł wspomina tylko o Linuksie, więc bash i TAK też zsh zrobią ... jeśli tagowanie jest tylko „bash”, musimy również dodać „zsh” do tagów
Carlos Saltos

2

najlepszy prosty sposób to następujący wiersz:
PATH="<directory you want to include>:$PATH"
w pliku .bashrc w katalogu domowym.
Nie zostanie zresetowany nawet po zamknięciu terminalu lub ponownym uruchomieniu komputera. Jest stały


1
@ quant, jeśli zrobisz to, co powiesz, spowoduje to trwałe ustawienie ustawień. zadziała, nawet jeśli zamkniesz terminal.
Edward Torvalds,

1

Myślę, że najbardziej eleganckim sposobem jest:

1. dodaj to w pliku ~. / Bashrc

if [ -d "new-path" ]; then
  PATH=$PATH:new-path
fi

2. źródło ~ / .bashrc

(Ubuntu)


Aby wyświetlić ścieżkę powyżej: printf "% s \ n" $ PATH
Robot70

1

jednym ze sposobów dodania stałej ścieżki, która działała dla mnie, jest:

    cd /etc/profile.d
    touch custom.sh
    vi custom.sh 
    export PATH=$PATH:/path according to your setting/

uruchom ponownie komputer, a my przejdziemy ścieżkę, czy będą na stałe wiwatować.


W rzeczywistości nie musisz ponownie uruchamiać komputera. Wystarczy wylogować się i ponownie zalogować. Jest to dość eleganckie rozwiązanie, ponieważ bardzo łatwo jest wycofać wszelkie zmiany bez konieczności edytowania plików. Łatwo jest również określić instrukcję if, aby jeśli katalog nie istniał w systemie, nie jest dodawany do zmiennej PATH.
Warwick,

0

W przypadku dystrybucji Debian musisz:

    - edit ~/.bashrc  e.g: vim ~/.bashrc 
    - add export PATH=$PATH:/path/to/dir
    - then restart your computer. Be aware that if you edit ~/.bashrc  as root, your environment variable you added will work only for root

0

To jest jednowarstwowy . Dodaje linię do .bashrc. Ta linia sprawdzi, czy katalog został już dodany do ścieżki i dołącz, jeśli nie. Zapobiegnie to duplikowaniu katalogu na ścieżce przy każdym źródle .bashrc.

echo "[[ \":\$PATH:\" != *\":$(pwd)/path/to/add:\"* ]] && export PATH=\"\${PATH:+\${PATH}}:$(pwd)/path/to/add\"" >> ~/.bashrc

source ~/.bashrc
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.