Hvordan tilføjer man korrekt en sti til PATH?
Jeg undrer mig over, hvor en ny sti skal tilføjes til miljøvariablen PATH
. Jeg ved, at dette kan gøres ved at redigere .bashrc
(for eksempel), men det er ikke klart, hvordan man gør det.
På denne måde:
export PATH=~/opt/bin:$PATH
eller dette?
export PATH=$PATH:~/opt/bin
930
3
De enkle ting
eller
afhængigt af, om du vil tilføje
~/opt/bin
i slutningen (der skal søges efter alle andre mapper, hvis der er et program med samme navn i flere mapper) eller i begyndelsen (der skal søges før alle andre mapper).Du kan tilføje flere poster på samme tid.
PATH=$PATH:~/opt/bin:~/opt/node/bin
eller variationer af denne rækkefølge fungerer fint. Lad være med at sætteexport
i begyndelsen af linjen, da det medfører yderligere komplikationer (se nedenfor under "Bemærkninger om andre skaller end bash").Hvis din
PATH
bliver bygget af mange forskellige komponenter, kan du ende med at få dobbelte poster. Se https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command og https://unix.stackexchange.com/questions/40749/remove-duplicate-path-entries-with-awk-command for at undgå at tilføje dubletter eller for at fjerne dem.Nogle distributioner sætter forresten automatisk
~/bin
ind i din PATH, hvis den findes.Hvor du skal sætte det
Sæt linjen til at ændre
PATH
i~/.profile
, eller i~/.bash_profile
, hvis det er det du har.Bemærk at
~/.bash_rc
ikke læses af noget program, og at~/.bashrc
er konfigurationsfilen for interaktive instanser af bash. Du bør ikke definere miljøvariabler i~/.bashrc
. Det rigtige sted at definere miljøvariabler somPATH
er~/.profile
(eller~/.bash_profile
, hvis du er ligeglad med andre skaller end bash). Se [Hvad er forskellen på dem, og hvilken skal jeg bruge?] (https://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile/183980#183980)Lad være med at lægge den i
/etc/environment
eller~/.pam_environment
: det er ikke shell-filer, du kan ikke bruge substitutioner som$PATH
derinde. I disse filer kan du kun tilsidesætte en variabel, ikke tilføje til den.Potentielle komplikationer i nogle systemskripter
Du behøver ikke
export
hvis variablen allerede er i miljøet: enhver ændring af variablens værdi afspejles i miljøet. ¹PATH
er stort set altid i miljøet; alle unix-systemer sætter den meget tidligt (som regel i den allerførste proces, faktisk).Ved login kan du stole på, at
PATH
allerede er i miljøet og allerede indeholder nogle systemmapper. Hvis du skriver et script, der kan blive udført tidligt, mens du opretter en slags virtuelt miljø, kan det være nødvendigt at sikre, atPATH
ikke er tomt og eksporteret: hvisPATH
stadig ikke er indstillet, så vil noget somPATH=$PATH:/some/directory
sættePATH
til:/some/directory
, og den tomme komponent i begyndelsen betyder den aktuelle mappe (som.:/some/directory
).Bemærkninger om andre skaller end bash
I bash, ksh og zsh er
export
en speciel syntaks, og bådePATH=~/opt/bin:$PATH
ogexport PATH=~/opt/bin:$PATH
gør endda det rigtige. I andre Bourne/POSIX-lignende shells såsom dash (som er/bin/sh
på mange systemer), bliverexport
analyseret som en almindelig kommando, hvilket indebærer to forskelle:~
bliver kun analyseret i begyndelsen af et ord, undtagen i opgaver (se https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command/25704#25704 for detaljer);$PATH
uden for dobbelte anførselstegn [brydes, hvisPATH
indeholder whitespace eller\[*?
] (https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters).Så i skaller som dash,
export PATH=~/opt/bin:$PATH
sætterPATH
til den bogstavelige streng~/opt/bin/:
efterfulgt af værdien afPATH
op til det første mellemrum.PATH=~/opt/bin:$PATH
(en simpel tildeling) [doesn't require quotes] (https://unix.stackexchange.com/questions/68694/when-is-double-quoting-necessary/68748#68748) og gør det rigtige. Hvis du vil brugeexport
i et portabelt script, skal du skriveexport PATH="$HOME/opt/bin:$PATH"
, ellerPATH=~/opt/bin:$PATH; export PATH
(ellerPATH=$HOME/opt/bin:$PATH; export PATH
for portabilitet til selv Bourne-shellen, der ikke accepteredeexport var=value
og ikke gjorde tildeudvidelse).¹ Dette var ikke sandt i Bourne-shells (som i den egentlige Bourne-shell, ikke moderne POSIX-stil-shells), men det er meget usandsynligt, at du støder på sådanne gamle shells i dag.
Begge måder virker, men de gør ikke det samme: elementerne i
PATH
kontrolleres fra venstre til højre. I dit første eksempel vil eksekverbare programmer i~/opt/bin
have forrang frem for dem, der f.eks. er installeret i/usr/bin
, hvilket måske eller måske ikke er det, du ønsker.Især ud fra et sikkerhedsmæssigt synspunkt er det farligt at tilføje stier forrest, for hvis nogen kan få skriveadgang til din
~/opt/bin
, kan de f.eks. lægge en andenls
deri, som du så sandsynligvis vil bruge i stedet for/bin/ls
uden at bemærke det. Forestil dig nu det samme forssh
eller din browser eller andet... (Det samme gælder tredobbelt for at sætte . i din sti).Jeg er forvirret over spørgsmål 2 (som siden er fjernet fra spørgsmålet, da det skyldtes et uvedkommende spørgsmål):