Zaujímalo by ma, kde je potrebné pridať novú cestu do premennej prostredia PATH
. Viem, že sa to dá dosiahnuť úpravou súboru .bashrc
(napríklad), ale nie je mi jasné, ako to urobiť.
Týmto spôsobom:
export PATH=~/opt/bin:$PATH
alebo toto?
export PATH=$PATH:~/opt/bin
PATH=$PATH:~/opt/bin
alebo
PATH=~/opt/bin:$PATH
podľa toho, či chcete pridať ~/opt/bin
na koniec (aby sa hľadalo za všetkými ostatnými adresármi v prípade, že sa program s rovnakým názvom nachádza vo viacerých adresároch) alebo na začiatok (aby sa hľadalo pred všetkými ostatnými adresármi).
Môžete pridať viacero záznamov súčasne. PATH=$PATH:~/opt/bin:~/opt/node/bin
alebo variácie poradia fungujú dobre. Na začiatok riadku nedávajte export
, pretože to prináša ďalšie komplikácie (pozri nižšie v časti "Poznámky k iným shellom ako bash").
Ak je váš PATH
vytváraný mnohými rôznymi komponentmi, môžete skončiť s duplicitnými záznamami. Pozrite si https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command a https://unix.stackexchange.com/questions/40749/remove-duplicate-path-entries-with-awk-command, aby ste sa vyhli pridávaniu duplikátov alebo ich odstránili.
Niektoré distribúcie mimochodom automaticky vkladajú ~/bin
do vášho PATH, ak existuje.
Riadok na úpravu PATH
vložte do ~/.profile
alebo do ~/.bash_profile
, ak ho máte.
Všimnite si, že ~/.bash_rc
nečíta žiadny program a ~/.bashrc
je konfiguračný súbor interaktívnych inštancií bashu. V ~/.bashrc
by ste nemali definovať premenné prostredia. Správnym miestom na definovanie premenných prostredia, ako je PATH
, je ~/.profile
(alebo ~/.bash_profile
, ak sa nestaráte o iné shelly ako bash). Pozri [Aký je medzi nimi rozdiel a ktorý mám použiť?] (https://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile/183980#183980)
Nevkladajte ho do /etc/environment
alebo ~/.pam_environment
: nie sú to shell súbory, nemôžete v nich používať substitúcie ako $PATH
. V týchto súboroch môžete premennú iba prepísať, nie ju pridať.
Nepotrebujete export
, ak je premenná už v prostredí: každá zmena hodnoty premennej sa premietne do prostredia. ¹ PATH
je v prostredí takmer vždy; všetky unixové systémy ju nastavujú veľmi skoro (v skutočnosti zvyčajne hneď v prvom procese).
V čase prihlásenia sa môžete spoľahnúť na to, že PATH
je už v prostredí a obsahuje už niektoré systémové adresáre. Ak'píšete skript, ktorý sa môže spustiť na začiatku pri nastavovaní nejakého virtuálneho prostredia, možno budete musieť zabezpečiť, aby PATH
nebolo prázdne a exportované: ak PATH
ešte nie je nastavené, potom niečo ako PATH=$PATH:/some/directory
nastaví PATH
na :/some/directory
a prázdna zložka na začiatku znamená aktuálny adresár (ako .:/some/directory
).
if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi
V bash, ksh a zsh je export
špeciálnou syntaxou, a tak PATH=~/opt/bin:$PATH
ako aj export PATH=~/opt/bin:$PATH
robia dokonca správnu vec. V iných shell-och typu Bourne/POSIX, ako je napríklad dash (ktorý je na mnohých systémoch /bin/sh
), sa export
analyzuje ako bežný príkaz, z čoho vyplývajú dva rozdiely:
~
sa analyzuje len na začiatku slova, s výnimkou priradení (podrobnosti nájdete na https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command/25704#25704);$PATH
mimo dvojitých úvodzoviek [sa preruší, ak PATH
obsahuje biele znaky alebo \[*?
](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters).Takže v shelloch ako dash, nastaví export PATH=~/opt/bin:$PATH
PATH
na literálny reťazec ~/opt/bin/:
nasledovaný hodnotou PATH
až po prvú medzeru.
PATH=~/opt/bin:$PATH
(holé priradenie) nevyžaduje úvodzovky a robí správnu vec. Ak chcete použiť export
v prenosnom skripte, musíte napísať export PATH="$HOME/opt/bin:$PATH"
, alebo PATH=~/opt/bin:$PATH; export PATH
(alebo PATH=$HOME/opt/bin:$PATH; export PATH
pre prenosnosť aj na Bourne shell, ktorý neakceptoval export var=value
a nerobil tilde expanziu).
¹ V Bournových shelloch (ako v skutočnom Bournovom shelle, nie v moderných shelloch v štýle POSIX) to'nebolo pravdou, ale v dnešnej dobe sa s takýmito starými shellmi s veľkou pravdepodobnosťou nestretnete.
Oba spôsoby fungujú, ale nerobia to isté: prvky PATH
sa kontrolujú zľava doprava. Vo vašom prvom príklade budú mať spustiteľné súbory v ~/opt/bin
prednosť pred tými, ktoré sú nainštalované napríklad v /usr/bin
, čo môže, ale nemusí byť to, čo chcete.
Najmä z bezpečnostného hľadiska je nebezpečné pridávať cesty dopredu, pretože ak niekto získa prístup na zápis do vášho ~/opt/bin
, môže tam umiestniť napríklad iný ls
, ktorý by ste potom pravdepodobne bez povšimnutia použili namiesto /bin/ls
. A teraz si predstavte to isté pre ssh
alebo váš prehliadač alebo iný výber... (To isté platí trojnásobne pre vloženie . do cesty.)
Mýli ma otázka č. 2 (ktorá bola z otázky odstránená, pretože sa týkala nesúvisiaceho problému):
Aký je použiteľný spôsob na pripojenie viacerých ciest na rôznych riadkoch?
Pôvodne som si myslel, že by to mohlo fungovať:
export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin
ale nie'to, pretože druhé priradenie nepridáva iba
~/opt/node/bin
, ale aj celé predtým priradenéPATH
.Toto je možné riešenie:
export PATH=$PATH:~/opt/bin:~/opt/node/bin
ale kvôli čitateľnosti by som'radšej mal jedno priradenie pre jednu cestu.
Ak poviete
PATH=~/opt/bin
to je všetko, čo bude vo vašom PATH. PATH je len premenná prostredia, a ak chcete do PATH niečo pridať, musíte premennú obnoviť presne takým obsahom, aký chcete. To znamená, že to, čo uvádzate ako príklad k otázke 2, je presne to, čo chcete urobiť, pokiaľ mi'úplne uniká zmysel otázky.
Vo svojom kóde používam obe formy. Mám všeobecný profil, ktorý inštalujem na každý počítač, na ktorom pracujem, a ktorý vyzerá takto, aby sa prispôsobil potenciálne chýbajúcim adresárom:
export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
if [ -d $bindir ]; then
PATH=$PATH:${bindir}
fi
done