Mani interesē, kur PATH
vides mainīgajam jāpievieno jauns ceļš. Zinu, ka to var izdarīt, rediģējot .bashrc
(piemēram), bet nav skaidrs, kā to izdarīt.
Šādā veidā:
export PATH=~/opt/bin:$PATH
vai šis?
export PATH=$PATH:~/opt/bin
PATH=$PATH:~/opt/bin
vai
PATH=~/opt/bin:$PATH
atkarībā no tā, vai vēlaties pievienot ~/opt/bin
beigās (lai meklētu pēc visiem pārējiem direktorijiem, ja programma ar tādu pašu nosaukumu ir vairākos direktorijos) vai sākumā (lai meklētu pirms visiem citiem direktorijiem).
Vienlaikus var pievienot vairākus ierakstus. PATH=$PATH:~/opt/bin:~/opt/node/bin
vai variācijas ar šādu secību darbojas labi. Nelietojiet export
rindas sākumā, jo tas rada papildu sarežģījumus (skat. tālāk sadaļā "Piezīmes par čaulām, kas nav bash").
Ja jūsu PATH
tiek veidots no daudziem dažādiem komponentiem, var rasties dublējoši ieraksti. Skatiet https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command un https://unix.stackexchange.com/questions/40749/remove-duplicate-path-entries-with-awk-command, lai izvairītos no dublikātu pievienošanas vai tos novērstu.
Starp citu, dažas distribūcijas automātiski iekļauj ~/bin
jūsu PATH, ja tas pastāv.
Ievietojiet rindu, lai mainītu PATH
, ~/.profile
vai ~/.bash_profile
, ja tas ir jūsu sistēmā.
Ņemiet vērā, ka ~/.bash_rc
nelasa neviena programma, un ~/.bashrc
ir interaktīvo bash gadījumu konfigurācijas fails. Jums nevajadzētu definēt vides mainīgos ~/.bashrc
. Pareizā vieta, kur definēt vides mainīgos, piemēram, PATH
, ir ~/.profile
(vai ~/.bash_profile
, ja jums ir vienalga par citiem apvalkiem, izņemot bash). Skatīt [Kāda ir starpība starp tiem un kuru no tiem man vajadzētu izmantot?] (https://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile/183980#183980).
Neievietot to /etc/environment
vai ~/.pam_environment
: tie nav čaulas faili, tajos nevar izmantot tādus aizstājējus kā $PATH
. Šajos failos var tikai aizstāt mainīgo, nevis to papildināt.
Ja mainīgais jau ir vidē, jums nav nepieciešams exportēt
: jebkuras mainīgā vērtības izmaiņas tiek atspoguļotas vidē. ¹ PATH
gandrīz vienmēr ir vidē; visas unix sistēmas to nosaka ļoti agri (parasti pašā pirmajā procesā).
Pieslēgšanās laikā var paļauties uz to, ka PATH
jau ir vidē un tajā jau ir daži sistēmas direktoriji. Ja rakstāt skriptu, kas var tikt izpildīts agrīnā stadijā, iestatot kādu virtuālo vidi, jums var būt nepieciešams pārliecināties, ka PATH
nav tukšs un eksportēts: ja PATH
vēl nav iestatīts, tad kaut kas līdzīgs PATH=$PATH:/some/directory
iestatītu PATH
uz :/some/directory
, un tukšais komponents sākumā nozīmē pašreizējo direktoriju (piemēram, .:/some/directory
).
if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi
Bash, ksh un zsh export
ir īpaša sintakse, un gan PATH=~/opt/bin:$PATH
, gan export PATH=~/opt/bin:$PATH
dara pareizo darbību. Citās Bourne/POSIX tipa čaulās, piemēram, dash (kas daudzās sistēmās ir /bin/sh
), export
tiek analizēts kā parasta komanda, kas nozīmē divas atšķirības:
~
tiek analizēts tikai vārda sākumā, izņemot uzdevumus (sīkāku informāciju skatiet https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command/25704#25704);$PATH
ārpus dubultajām pēdiņām [tiek pārtraukta, ja PATH
satur baltās zīmes vai \[*?
](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters).Tātad tādās čaulās kā dash, nosaka export PATH=~~/opt/bin:$PATH
PATH
kā burtisku virkni ~/opt/bin/:
, kurai seko PATH
vērtība līdz pirmajai atstarpei.
PATH=~/opt/bin:$PATH
(tukšais piešķīrums) neprasa pēdiņas un veic pareizo darbību. Ja vēlaties izmantot export
pārnesamā skripta rakstā, jums jāraksta export PATH="$HOME/opt/bin:$PATH"
vai PATH=~/opt/bin:$PATH; export PATH
(vai PATH=$HOME/opt/bin:$PATH; export PATH
, lai nodrošinātu pārnesamību pat uz Bourne apvalku, kas nepieņēma export var=vērtība
un neizvērsa tilde).
¹ Bourne čaulās (kā īstajā Bourne čaulā, nevis mūsdienu POSIX stila čaulās) tas nebija taisnība, bet maz ticams, ka mūsdienās jūs sastapsieties ar šādām vecām čaulām.
Jebkurš no šiem veidiem darbojas, bet tie nedara vienu un to pašu: PATH
elementi tiek pārbaudīti no kreisās puses uz labo. Jūsu pirmajā piemērā izpildāmajiem failiem, kas atrodas ~/opt/bin
, būs priekšroka salīdzinājumā ar tiem, kas instalēti, piemēram, /usr/bin
, kas var būt vai nebūt tas, ko jūs vēlaties.
Jo īpaši no drošības viedokļa ir bīstami pievienot ceļus priekšā, jo, ja kāds var iegūt rakstīšanas piekļuvi jūsu ~/opt/bin
, viņš tur var ievietot, piemēram, citu ls
, ko jūs, iespējams, izmantotu /bin/ls
vietā, nemanot. Tagad iedomājieties, ka tas pats attiecas uz ssh
vai jūsu pārlūkprogrammu, vai citu izvēli... (Tas pats trīskārši attiecas uz . ievietošanu ceļā.)
Mani mulsina 2. jautājums (kopš tā brīža tas tika izņemts no jautājuma, jo tas bija saistīts ar nesaistītu jautājumu):
Kāds ir praktisks veids, kā pievienot vairākus ceļus dažādās rindās? Sākotnēji es domāju, ka tas varētu izdarīt šo triku:
export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin
bet tas tā nav, jo otrais piešķīrums ne tikai pievieno
~~/opt/node/bin
, bet arī visu iepriekš piešķirtoPATH
.Šis ir iespējams risinājums:
export PATH=$PATH:~/opt/bin:~/opt/node/bin
bet lasāmības labad es gribētu, lai vienam ceļam būtu viens piešķīrums.
Ja jūs sakāt
PATH=~/opt/bin
tas ir viss**, kas būs jūsu PATH. PATH ir tikai vides mainīgais, un, ja vēlaties papildināt PATH, jums ir jāatjauno mainīgais ar tieši tādu saturu, kādu vēlaties. Tas nozīmē, ka tas, ko jūs minējāt kā piemēru 2. jautājumam, ir tieši tas, ko jūs vēlaties darīt, ja vien es pilnīgi nesaprotu jautājuma jēgu.
Savā kodā es izmantoju abas formas. Man ir vispārīgs profils, ko es instalēju katrā datorā, kurā strādāju, un kas izskatās šādi, lai pielāgotos iespējamiem direktoriju iztrūkumiem:
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