Dodanie nowego wpisu do zmiennej PATH w ZSH

188

Używam zsh i próbuję dodać nowy wpis ( /home/david/pear/bin) do PATHzmiennej, ale nie wiem jak.

Najbardziej dezorientuje mnie to, że PATHw moim ~/.zshrcpliku nie ma ani jednego odwołania do zmiennej , ale echo $PATHzwraca:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Więc PATHgdzieś ustawiana jest zmienna.

David Barreto
źródło

Odpowiedzi:

211

Tutaj dodaj tę linię do .zshrc:

export PATH=/home/david/pear/bin:$PATH

EDYCJA : To działa, ale poniższa odpowiedź jest lepsza, ponieważ korzysta ze strukturalnego interfejsu ZSH dla zmiennych takich jak $PATH. To podejście jest standardowe bash, ale o ile wiem, nie ma powodu, aby stosować je, gdy ZSH zapewnia lepsze alternatywy.

Linuxios
źródło
29
haha zapomniałem, myślałem, że to tylko polecenie konsoli, ale dodanie tej linii do .zshrc załatwiło sprawę. Wielkie dzięki!
David Barreto,
1
Mój plik .zshrc miał już linię do eksportowania PATH, więc zastąpiłem ją zmodyfikowaną.
Zack Huston
6
Musiałem usunąć podwójne cudzysłowy wokół zapisów tj PATH="/home/david/pear/bin:/usr/bin:etc"aby PATH=/home/david/pear/bin:/usr/bin:etcna to, aby zatrzymać się w zshrc.
a7omiton
3
@taco, możesz użyć $ HOME
mencargo
1
@DanielSpringer: Tak. Gdy otworzysz powłokę, odziedziczy ona PATHpo procesie nadrzędnym, który ją uruchomił, a następnie, gdy zostanie uruchomiona .zshrc( .bashrclub cokolwiek innego), pozwala to na dodanie dodatkowych elementów do tej ścieżki.
Linuxios,
222

W rzeczywistości użycie ZSH pozwala na użycie specjalnego mapowania zmiennych środowiskowych. Możesz więc po prostu zrobić:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

Dla mnie jest to bardzo fajna funkcja, którą można propagować do innych zmiennych. Przykład:

typeset -T LD_LIBRARY_PATH ld_library_path :
ony
źródło
16
Niezła odpowiedź. W moim przypadku ~/.zshrcjest pozyskiwany po .profilei zastępuje wszystko w .profile. Trochę pociągnęłam za włosy, żeby je rozgryźć.
Khanh Nguyen
1
Dołączana skrzynka nie potrzebuje parenów, chyba że dołączasz więcej niż jeden element. Często też nie potrzebuje cytatów. Tak więc prosty, krótki sposób na dołączenie jest
Micah Elliott
1
@SuperUberDuper, powinieneś zrozumieć, że prawie każda powłoka uniksowa po prostu odczytuje pliki startowe, co robi prawie to samo, jakbyś wpisał ją do powłoki interaktywnie. Jeśli chodzi o pliki „rc”, możesz znaleźć interesującą odpowiedź na to pytanie
tylko
6
Można uniknąć jawnego eksportu za pomocą -xi pozostawić tylko unikalne wartości w zmiennej z -U, domyślnie przyjmuje się dwukropek, więc może to być:typeset -TUx PATH path
Smutek
2
@DanielSpringer, no. Jeśli chcesz to w tych kategoriach, to: path=(...)(bez odniesienia $pathlub $PATHwewnątrz) przypisuje, dołącza path=(... $path)i path+(...)dołącza.
ony
40

Możesz dołączyć do swojego PATHw minimalny sposób. Nie potrzebujesz nawiasów, chyba że dodajesz więcej niż jeden element. Zwykle też nie potrzebuje cytatów. Tak więc prosty, krótki sposób na dołączenie jest:

path+=/some/new/bin/dir

Wspólne użycie

Następnie wspólnym wzorcem testowania nowego skryptu / pliku wykonywalnego jest:

path+=$PWD/.
# or
path+=$PWD/bin

Ta składnia pisana małymi literami jest używana pathjako tablica , ale wpływa również na jej odpowiednik partnera wielkiej litery PATH(z którym jest „związany” przez typeset).

(Zauważ, że nie :jest potrzebne / potrzebne jako separator ).

Powiązane ciekawostki

Traktowanie w pathten sposób (jako tablicę) oznacza również: nie trzeba robić, rehash aby znaleźć nowo załatane polecenia.

Spójrz również na vared pathdynamiczny sposób edycjipath i innych rzeczy.

To pathpytanie może Cię zainteresować , ale ponieważ mówimy o eksportach i tablicach, pamiętaj, że tablic zasadniczo nie można eksportować.

Możesz nawet zapobiec PATHprzyjmowaniu zduplikowanych wpisów (patrz to i to ):

typeset -U path
Micah Elliott
źródło
Czy nie powinna to być „ścieżka + =: / foo / bar”? (z dwukropkiem)
andrew lorien
1
@ andrewlorien Zaktualizowałem odpowiedź szczegółowymi informacjami na temat separatora jelita grubego.
Micah Elliott,
Zauważ, że jeśli po ścieżce jest komentarz, to potrzebujemy cytatów, takich jak path+='my/path' # for fun. To oczywiste, jeśli masz spacje, ale nie tak bardzo, jeśli masz komentarze.
Franklin Yu,
„(Zauważ, że no: jest potrzebne / potrzebne jako separator.)” Dotyczy to tylko małych liter path. Poprzedzenie :jest wymagane dla PATH, jak następuje w .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.
36

jedna wkładka, bez otwierania ~/.zshrcpliku

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

lub

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Aby zobaczyć efekt, wykonaj source ~/.zshrctę samą kartę lub otwórz nową kartę

Siva Praveen
źródło
1
Działa perfekcyjnie na OSX z powłoką Zsh.
Stryker
1
Działa jak urok!
Akbar Sha Ebrahim
14
  1. Dodano ścieżkę do ~ / .zshrc

    sudo vi ~/.zshrc

    dodaj nową ścieżkę

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Zaktualizuj ~ / .zshrc

    Zapisz ~ / .zshrc

    source ~/.zshrc

  3. Sprawdź ŚCIEŻKĘ

    echo $PATH

saneryee
źródło
2
To jest Bashdroga.
CousinCocaine,
13

OPCJA 1: Dodaj tę linię do ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

Następnie musisz uruchomić source ~/.zshrc, aby zmiany odniosły skutek LUB zamknąć to okno i otworzyć nowe

OPCJA 2: uruchom go w konsoli terminala, aby dodać tę ścieżkę tylko do bieżącej sesji okna terminala. Po zamknięciu okna / sesji zostanie ono utracone.

Dimitar
źródło
Czy możesz wyjaśnić, w jaki sposób ta odpowiedź różni się od tej samej odpowiedzi opublikowanej 5 lat temu ?
Franklin Yu,
w tej odpowiedzi nie jest powiedziane, że musisz dodać ten wiersz kodu do pliku, jeśli po prostu uruchomisz go w ten sposób, zmieni się on tylko w obecnych oknach i nie jest to wyjaśnione w pierwotnej odpowiedzi
Dimitar