Zastanawiam się, gdzie należy dodać nową ścieżkę do PATH
zmiennej środowiskowej. Wiem, że można to osiągnąć przez edycję .bashrc
(na przykład), ale nie jest jasne, jak to zrobić.
Tą drogą:
export PATH=~/opt/bin:$PATH
albo to?
export PATH=$PATH:~/opt/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin
Można dodać inną, oddzielając za pomocą: npPATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Odpowiedzi:
Proste rzeczy
lub
w zależności od tego, czy chcesz dodać
~/opt/bin
na końcu (do przeszukania po wszystkich innych katalogach, w przypadku gdy program ma taką samą nazwę w wielu katalogach), czy na początku (do przeszukania przed wszystkimi innymi katalogami).Możesz dodać wiele wpisów jednocześnie.
PATH=$PATH:~/opt/bin:~/opt/node/bin
lub zmiany w zamówieniu działają dobrze. Nie umieszczajexport
na początku linii, ponieważ ma ona dodatkowe komplikacje (patrz poniżej w „Notatkach o powłokach innych niż bash”).Jeśli twoja
PATH
kompilacja składa się z wielu różnych komponentów, możesz mieć zduplikowane wpisy. Zobacz Jak dodać ścieżkę katalogu domowego, która ma zostać wykryta przez Unix, które polecenie? i Usuń zduplikowane wpisy $ PATH za pomocą polecenia awk, aby uniknąć dodawania lub usuwania duplikatów.Nawiasem mówiąc, niektóre dystrybucje automatycznie umieszczają
~/bin
W ŚCIEŻKĘ, jeśli istnieje.Gdzie to położyć
Umieścić linię zmodyfikować
PATH
w~/.profile
, lub~/.bash_profile
jeśli to, co masz.Zauważ, że
~/.bash_rc
nie jest odczytywany przez żaden program i~/.bashrc
jest plikiem konfiguracyjnym interaktywnych instancji bash. Nie powinieneś definiować zmiennych środowiskowych w~/.bashrc
. Właściwym miejscem do zdefiniowania zmiennych środowiskowych, takich jakPATH
is~/.profile
(lub~/.bash_profile
jeśli nie obchodzą Cię powłoki inne niż bash). Zobacz, jaka jest różnica między nimi a tym, którego powinienem użyć?Nie wkładaj go
/etc/environment
lub~/.pam_environment
: nie są to pliki powłoki, nie możesz używać podstawień jak$PATH
tam. W tych plikach można jedynie zastąpić zmienną, a nie dodawać do niej.Potencjalne komplikacje w niektórych skryptach systemowych
Nie potrzebujesz,
export
jeśli zmienna jest już w środowisku: każda zmiana wartości zmiennej jest odzwierciedlana w środowiskuPATH
.¹ jest prawie zawsze w środowisku; wszystkie systemy uniksowe ustawiają go bardzo wcześnie (zazwyczaj w pierwszym procesie).Podczas logowania możesz polegać na
PATH
tym , że jesteś już w środowisku i zawiera już niektóre katalogi systemowe. Jeśli piszesz skrypt, który może zostać wykonany wcześnie podczas konfigurowania jakiegoś środowiska wirtualnego, może być konieczne upewnienie się, żePATH
nie jest pusty i wyeksportowany: jeśliPATH
nadal nie jest ustawiony, to coś podobnegoPATH=$PATH:/some/directory
ustawi sięPATH
na:/some/directory
, a pusty komponent na początku oznacza bieżący katalog (jak.:/some/directory
).Uwagi na temat muszli innych niż bash
W bash, ksh i zsh,
export
jest specjalna składnia, i oba,PATH=~/opt/bin:$PATH
iexport PATH=~/opt/bin:$PATH
czynią to, co należy. W innych powłokach w stylu Bourne / POSIX, takich jak dash (/bin/sh
w wielu systemach),export
jest analizowany jako zwykłe polecenie, co implikuje dwie różnice:~
jest analizowany tylko na początku słowa, z wyjątkiem przypisań (zobacz Jak dodać ścieżkę do katalogu domowego, która ma zostać odkryta przez Unix, które polecenie ?, aby poznać szczegóły);$PATH
poza podwójnymi cudzysłowami łamie się, jeśliPATH
zawiera spacje lub\[*?
.Tak więc w powłokach, takich jak myślnik,
ustawiaexport PATH=~/opt/bin:$PATH
PATH
się na literał ciąg,~/opt/bin/:
po którym następuje wartośćPATH
do pierwszej spacji.PATH=~/opt/bin:$PATH
(nagie zadanie) nie wymaga cytatów i robi właściwą rzecz. Jeśli chcesz używaćexport
w przenośnym skrypcie, musisz napisaćexport PATH="$HOME/opt/bin:$PATH"
, lubPATH=~/opt/bin:$PATH; export PATH
(lubPATH=$HOME/opt/bin:$PATH; export PATH
dla przenośności nawet powłoki Bourne'a, która nie zaakceptowałaexport var=value
i nie zrobiła rozszerzenia tyldy).¹ Nie było to prawdą w przypadku powłok Bourne'a (tak jak w przypadku rzeczywistej powłoki Bourne'a, a nie nowoczesnych powłok w stylu POSIX), ale w dzisiejszych czasach jest bardzo mało prawdopodobne, aby spotkać takie stare powłoki.
źródło
export
..bashrc
. Zakładam, że ponieważ FZF jest napisany również w Rust, jest zgodny ze wzorem Rust.Tak czy inaczej działa, ale nie robią tego samego: elementy
PATH
są sprawdzane od lewej do prawej. W pierwszym przykładzie pliki wykonywalne w~/opt/bin
będą miały pierwszeństwo przed tymi zainstalowanymi, na przykład w/usr/bin
, które mogą, ale nie muszą być tym, czego chcesz.W szczególności, z punktu widzenia bezpieczeństwa niebezpieczne jest dodawanie ścieżek z przodu, ponieważ jeśli ktoś może uzyskać dostęp do twojego zapisu
~/opt/bin
, może na przykład umieścić tam inną ścieżkęls
, której prawdopodobnie użyłbyś w zamian z/bin/ls
niezauważalnie. Teraz wyobraź sobie to samo,ssh
przeglądarkę lub wybór ... (To samo tyczy się umieszczania. Na swojej drodze.)źródło
ls
, musisz umieścić ją w katalogu przed/bin
.Jestem zdezorientowany pytaniem 2 (ponieważ zostało usunięte z pytania, ponieważ było to spowodowane niepowiązanym problemem):
Jeśli powiesz
to wszystko będzie w waszej ŚCIEŻCE. ŚCIEŻKA jest tylko zmienną środowiskową, a jeśli chcesz dodać do ŚCIEŻKI, musisz odbudować zmienną o dokładnie takiej zawartości, jakiej chcesz. To, co podajesz jako przykład pytania 2, jest dokładnie tym, co chcesz zrobić, chyba że całkowicie nie rozumiem sedna pytania.
Używam obu formularzy w moim kodzie. Mam ogólny profil, który instaluję na każdym komputerze, na którym pracuję, który wygląda tak, aby uwzględnić potencjalnie brakujące katalogi:
źródło
Kuloodporny sposób dołączania / przygotowywania
Istnieje wiele rozważań związanych z wyborem dołączania zamiast dodawania. Wiele z nich jest objętych innymi odpowiedziami, więc nie będę ich tutaj powtarzał.
Ważną kwestią jest to, że nawet jeśli skrypty systemowe nie używają tego (zastanawiam się, dlaczego) * 1 , kuloodpornym sposobem dodania ścieżki (np.
$HOME/bin
) Do zmiennej środowiskowej PATH jestdo dołączania (zamiast
PATH="$PATH:$HOME/bin"
) ido dodawania (zamiast
PATH="$HOME/bin:$PATH"
)Pozwala to uniknąć fałszywego wiodącego / końcowego okrężnicy, gdy
$PATH
jest początkowo pusty, co może mieć niepożądane skutki uboczne i może stać się koszmarem , nieuchwytnym do znalezienia ( ta odpowiedź krótkoawk
opisuje przypadek ).Objaśnienie (z rozszerzenia parametrów powłoki ):
Zatem
${PATH:+${PATH}:}
jest rozwinięty do: 1) nic, jeśliPATH
jest zerowy lub nieustawiony, 2)${PATH}:
, jeśliPATH
jest ustawiony.Uwaga : To jest bash.
* 1 Właśnie odkryłem, że takie skrypty
devtoolset-6/enable
faktycznie tego używają,źródło
Linux określa wykonywalną ścieżkę wyszukiwania za pomocą
$PATH
zmiennej środowiskowej. Aby dodać katalog / dane / myscripts na początku$PATH
zmiennej środowiskowej, użyj:Aby dodać ten katalog na końcu ścieżki, użyj następującego polecenia:
Ale powyższe nie są wystarczające, ponieważ po ustawieniu zmiennej środowiskowej w skrypcie zmiana ta jest skuteczna tylko w skrypcie. Istnieją tylko dwa sposoby obejścia tego ograniczenia:
Przykłady:
Włączenie zasadniczo obejmuje skrypt „wywoływany” w skrypcie „wywołującym”. To jest jak #include w C. Więc działa w skrypcie lub programie „wywołującym”. Ale oczywiście nie działa w żadnych programach ani skryptach wywoływanych przez program wywołujący. Aby było skuteczne przez cały łańcuch połączeń, należy postępować zgodnie z ustawieniem zmiennej środowiskowej za pomocą polecenia eksportu.
Na przykład program powłoki bash dołącza zawartość pliku .bash_profile. Umieść następujące 2 linie w .bash_profile:
skutecznie umieszcza te 2 linie kodu w programie bash. Zatem w bash zmienna $ PATH zawiera
$HOME/myscript.sh
, a ze względu na instrukcję eksportu, wszystkie programy wywoływane przez bash mają zmienioną$PATH
zmienną. Ponieważ wszystkie programy uruchamiane z wiersza polecenia bash są wywoływane przez polecenie bash, nowa ścieżka obowiązuje dla wszystkich elementów uruchamianych z wiersza polecenia bash.Najważniejsze jest to, że aby dodać nowy katalog do ścieżki, musisz dołączyć lub dołączyć katalog do zmiennej środowiskowej $ PATH w skrypcie zawartym w powłoce i musisz wyeksportować
$PATH
zmienną środowiskową.Więcej informacji tutaj
źródło
Od pewnego czasu mam utrzymywane ze mną dwie funkcje
pathadd
ipathrm
które pomagają w dodawanie elementów do ścieżki bez konieczności martwienia się o duplikacji.pathadd
pobiera argument z pojedynczą ścieżką i argument opcjonalny,after
który, jeśli zostanie podany, dołącza do niego, wPATH
przeciwnym razie poprzedza go.W prawie każdej sytuacji, jeśli dodajesz do ścieżki, prawdopodobnie chcesz zastąpić wszystko, co już znajduje się na ścieżce, dlatego domyślnie wybieram prepend.
Umieść je w dowolnym skrypcie, który chcesz zmienić środowisko PATH, a teraz możesz to zrobić.
Na pewno nie dodasz do ścieżki, jeśli już tam jest. Jeśli chcesz teraz upewnić się, że
/baz/bat
jest na początku.Teraz każdą ścieżkę można przesunąć na przód, jeśli już znajduje się na ścieżce bez podwajania.
źródło
Nie mogę mówić o innych dystrybucjach, ale Ubuntu ma plik / etc / environment, który jest domyślną ścieżką wyszukiwania dla wszystkich użytkowników. Ponieważ mój komputer jest używany tylko przeze mnie, umieszczam tam na swojej ścieżce dowolne katalogi, chyba że jest to tymczasowy dodatek, który umieszczam w skrypcie.
źródło
Istnieją sytuacje, w których użycie
PATH=/a/b:$PATH
może być uznane za „niepoprawny” sposób dodania ścieżki doPATH
:PATH
w tej samej formie.PATH
innej formie (tj. Alias z powodu użycia dowiązań symbolicznych lub..
).PATH
gdy ma to zastąpić inne wpisy wPATH
.Ta funkcja (tylko Bash) wykonuje „słuszną rzecz” w powyższych sytuacjach (z wyjątkiem, patrz poniżej), zwraca kody błędów i drukuje ładne wiadomości dla ludzi. Kody błędów i komunikaty można wyłączyć, gdy nie są potrzebne.
Wyjątkiem jest to, że ta funkcja nie kanonizuje ścieżek dodanych
PATH
za pomocą innych środków, więc jeśli znajduje się niekanoniczny alias ścieżkiPATH
, spowoduje to dodanie duplikatu. Próba kanonizacji ścieżek już znajdujących się wPATH
jest ponurą propozycją, ponieważ ścieżka względna ma oczywiste znaczenie, gdy jest przekazywana,prepath
ale gdy już znajduje się na ścieżce, nie wiesz, jaki był bieżący katalog roboczy, gdy został dodany.źródło
$PATH
jak poprzednio. Jeśli chodzi o-r
nie, myślę, że ścieżki względne$PATH
są po prostu zbyt zawodne i dziwne (twoja ścieżka zmienia się za każdym razemcd
!), Aby chcieć wspierać coś takiego w ogólnym narzędziu.Dla mnie (w Mac OS X 10.9.5) dodanie nazwy ścieżki (np.
/mypathname
) Do pliku/etc/paths
działało bardzo dobrze.Przed edycją
echo $PATH
zwraca:Po edycji
/etc/paths
i zrestartowaniu powłoki dołączana jest zmienna $ PATH/pathname
. Rzeczywiścieecho $PATH
zwraca:Stało się to, że
/mypathname
zostało dołączone do$PATH
zmiennej.źródło
Aby dodać nową ścieżkę do
PATH
zmiennej środowiskowej:Do tej zmiany należy zastosować do każdej muszli otwarciu, dodaj go do pliku, że powłoka będzie pozyskiwania gdy jest wywoływany. W różnych powłokach może to być:
na przykład
Podaną ścieżkę można zobaczyć w powyższym wyniku.
źródło
Oto moje rozwiązanie:
Przyjemna, prosta wkładka, która nie pozostawia śladów
:
źródło