Linux ceļš, kā norādīt mapes ceļus. PATH vides mainīgais. Lietotāja un sistēmas vides mainīgo pievienošana operētājsistēmā Linux

Kad ievadāt komandu komandrinda, jūs būtībā sakāt čaulai palaist izpildāmo failu ar noteiktu nosaukumu. Uz Linux šie izpildāmās programmas, piemēram, ls, find, file un citi parasti atrodas vairākos dažādos jūsu sistēmas direktorijos. Jebkuru failu ar izpildāmām atļaujām, kas glabājas šajos direktorijos, var palaist no jebkuras vietas. Visizplatītākie direktoriji, kuros ir izpildāmās programmas, ir /bin, /sbin, /usr/sbin, /usr/local/bin un /usr/local/sbin.

Bet kā apvalks zina, kuros direktorijos meklēt izpildāmās programmas, vai vai apvalks meklē visā failu sistēma?

Atbilde ir vienkārša. Izdodot komandu, apvalks meklē izpildāmo failu ar šādu nosaukumu visos direktorijos, kas norādīti lietotāja mainīgajā $PATH.

Šajā rakstā ir parādīts, kā pievienot direktorijus sistēmas mainīgajam $PATH.

Kas ir $PATH operētājsistēmā Linux

Vides mainīgais $PATH ir kolonnizēts direktoriju saraksts, kas norāda apvalkam, kuros direktorijos meklēt izpildāmos failus.

Lai pārbaudītu, kuri direktoriji ir jūsu mainīgajā $PATH, varat izmantot komandu printenv vai echo:

Atbalss $PATH

Izvade izskatīsies apmēram šādi:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Ja jums ir divi izpildāmie faili ar tādu pašu nosaukumu, kas atrodas divos dažādos direktorijos, apvalks palaidīs failu, kas atrodas direktorijā, kas ir pirmais $PATH.

Direktorija pievienošana jūsu $PATH

Pastāv situācijas, kad varat savam mainīgajam $PATH pievienot citus direktorijus. Piemēram, dažas programmas var tikt instalētas dažādās vietās, vai arī jūs, iespējams, vēlēsities izveidot īpašu direktoriju saviem personīgajiem ierakstiem, taču varat tos palaist, nenorādot absolūto ceļu uz izpildāmajiem failiem. Lai to izdarītu, jums vienkārši jāpievieno direktorijs savam $PATH.

Pieņemsim, ka jūsu mājas direktorijā atrodas direktorijs ar nosaukumu bin, kurā glabājat čaulas skriptus. Lai savam mainīgajam $PATH pievienotu direktoriju:

Eksporta komanda eksportē modificēto mainīgo uz čaulas procesu pakārtotajām vidēm.

Tagad varat palaist savus skriptus, vienkārši ierakstot izpildāmā skripta nosaukumu, nenorādot pilnu ceļu uz izpildāmo failu.

Tomēr šīs izmaiņas ir īslaicīgas un ietekmē tikai pašreizējo čaulas sesiju.

Lai izmaiņas būtu pastāvīgas, čaulas konfigurācijas failos ir jādefinē mainīgais $PATH. Lielākajā daļā Linux izplatījumu, uzsākot jaunu sesiju, vides mainīgie tiek nolasīti no šādiem failiem:

  • Globālie apvalka konfigurācijas faili, piemēram, /etc/environment un /etc/profile. Izmantojiet šo failu, ja vēlaties, lai jaunais direktorijs tiktu pievienots visiem sistēmas lietotājiem$PATH.
  • Atsevišķu lietotāju čaulu konfigurācijas faili. Piemēram, ja izmantojat Bash, varat iestatīt mainīgo $PATH failā ~/.bashrc, un, ja izmantojat Zsh, faila nosaukums ir ~/.zshrc.

Šajā piemērā failā ~/.bashrc iestatīsim mainīgo. Atveriet failu iekšā teksta redaktors un beigās pievienojiet šādu rindu:

Nano ~/.bashrc

Eksportēt PATH="$HOME/bin:$PATH"

Saglabājiet failu un ielādējiet jauno $PATH vērtību pašreizējā čaulas sesijā, izmantojot:

Avots ~/.bashrc

Lai apstiprinātu, ka direktorijs ir veiksmīgi pievienots, izdrukājiet tā $PATH vērtību, ierakstot:

Atbalss $PATH

Secinājums

Jaunu direktoriju pievienošana lietotāja vai globālajam $PATH ir diezgan vienkārša. Tas ļauj palaist komandas un skriptus, kas glabājas nestandarta vietās, neievadot pilnu ceļu uz izpildāmo failu.

Tie paši norādījumi attiecas uz jebkuru Linux izplatīšana, tostarp , CentOS, RHEL, Debian un Linux Mint.

Jūtieties brīvi atstāt komentāru, ja jums ir kādi jautājumi.

Kas tas ir? Daudzām komandām, kuras ievadāt komandu uzvednē, ir jāizmanto ārēja programma, kas tiek ielādēta no failu sistēmas. Piemēram, tādas komandas kā mkdir un wc faktiski atrodas mapē /bin.

Ievadot instrukciju, kuru Bash apvalks neatpazīst, tā mēģina to izpildīt kā programmu un atgriež kļūdu, ja tā neatrod programmu ar šādu nosaukumu. Un tas attiecas ne tikai uz pamata komandām, kuras mēs apskatījām, jo ​​no komandrindas varat palaist jebkuru programmu.


Bet kā tad, ja ir fails Linux sistēma zina, kuras programmas palaist no kuriem direktorijiem? OS izmanto sistēmas vides mainīgo, lai norādītu mapju apakškopu, kuras meklēt, saņemot nezināmu komandu. Šo mainīgo sauc par PATH, un to var parādīt ar šādu echo komandu (nepieciešams simbols $):

Atbalss $PATH

Šīs komandas izvade izskatīsies šādi septiņi absolūtie mapes ceļi, kas atdalīti ar koliem:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Katru reizi, kad ievadāt nezināmo Linux komandas izskatīs katru no vides mainīgajā norādītajām mapēm tādā secībā, kādā tās tika norādītas, mēģinot atrast programmu ar tādu pašu nosaukumu. Ja programma tiek atrasta, tā tiek palaista; pretējā gadījumā tiek parādīts kļūdas ziņojums. Taču tā nebūs kļūda, ja iegādāsieties mīļotos sudraba gredzenus kā dāvanu. Sudrabs rotās jebkuru sievieti!

Šīs septiņas mapes nodrošina ērta piekļuve visām galvenajām programmām operētājsistēma, ieskaitot. Programmas ārpus šīm septiņām mapēm nevar palaist, vienkārši ierakstot to nosaukumu komandrindā.

Piemēram, jūs lejupielādējāt dienasgrāmatas utilītu no interneta savā mājas mapē. Ja komandu uzvednē ievadāt tā nosaukumu, tiks parādīts kļūdas ziņojums, jo tas atrodas mapē, kas nav iekļauta sistēmas ceļā. Lai palaistu šo programmu, ievadiet šo rindiņu (atcerieties, simbols ~ ir jūsu mājas mapes saīsinājums):

Ja saglabājāt to mapē ārpus norādītā ceļa, jums būs jāievada absolūtais ceļš un faila nosaukums, lai palaistu utilītu.

Protams, tiek pieņemts, ka dienasgrāmata ir vienkārša atsevišķa programma, kurai nav nepieciešama instalēšana, jo lielākā daļa lielāko lietojumprogrammu instalēšanas procesa laikā ievietos programmas izpildāmo failu kaut kur jūsu norādītajā ceļā. Kā šis PATH vides mainīgais, izbaudiet to savai veselībai!

eksportēt PATH=~/opt/bin:$PATH

Eksportēt PATH=$PATH:~/opt/bin

9 Risinājumi apkopo tīmekļa veidlapas “Kā pareizi pievienot ceļu uz PATH?”

Vienkāršas lietas

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

atkarībā no tā, vai vēlaties pievienot ~/opt/bin beigās (lai meklētu visos pārējos direktorijos, ja vairākos direktorijos ir programma ar tādu pašu nosaukumu) vai sākumā (lai meklētu pirms visiem pārējiem direktorijiem).

Vienlaikus varat pievienot vairākus ierakstus. PATH=$PATH:~/opt/bin:~/opt/node/bin vai izmaiņas secībā ir piemērotas.

Jums nav nepieciešams eksportēt, ja mainīgais jau atrodas vidē: jebkuras izmaiņas mainīgā vērtībā tiek atspoguļotas vidē. PATH gandrīz vienmēr atrodas vidē; Visi unix sistēmas instalējiet to ļoti agri (parasti jau pašā pirmajā procesā).

Ja jūsu PATH ir iebūvēts dažādos komponentos, var rasties ierakstu dublikāti. Skatiet sadaļu Kā pievienot ceļu uz avota direktoriju, kas jāatrod Unix, kāda ir komanda? un noņemiet dublētos $PATH ierakstus, izmantojot komandu awk, lai izvairītos no dublikātu pievienošanas vai noņemšanas.

Kur likt

Ņemiet vērā, ka ~/.bash_rc nevar nolasīt neviena programma, un ~/.bashrc ir interaktīvo bash gadījumu konfigurācijas fails. Vides mainīgos nevajadzētu definēt failā ~/.bashrc. Pareizā vieta, kur definēt vides mainīgos, piemēram, PATH, ir ~/.profile (vai ~/.bash_profile, ja jums nav nepieciešami apvalki, kas nav bash). Skatiet, kāda ir atšķirība starp tām un kuru man vajadzētu izmantot?

Piezīmes par ne-bash apvalkiem

Programmā bash, ksh un zsh eksportēšana ir īpaša sintakse, un gan PATH=~/opt/bin:$PATH, gan eksportēšana PATH=~/opt/bin:$PATH visu dara pareizi. Citos Bourne/POSIX apvalkos, piemēram, dash (kas daudzās sistēmās ir /bin/sh), eksportēšana tiek parsēta kā parasta komanda, kas nozīmē divas atšķirības:

  • ~ tiek parsēts tikai vārda sākumā, izņemot uzdevumus (skatiet sadaļu "Kā pievienot ceļu avota direktorijam, kuru atklās Unix, kāda komanda?").
  • $PATH ārpus dubultpēdiņām ir pārtraukumi, ja PATH satur atstarpes vai \[*? ,

Tātad domuzīmei līdzīgos čaulos eksportēšana PATH=~/opt/bin:$PATH iestata PATH uz burtisku virkni ~/opt/bin/: kam seko PATH vērtība līdz pirmajai vietai. PATH=~/opt/bin:$PATH (izplūdušais uzdevums) neprasa pēdiņas un rīkojas pareizi. Ja vēlaties izmantot eksportēšanu portatīvā skriptā, jums jāieraksta eksportēšanas PATH="$HOME/opt/bin:$PATH" .

¹ Tā nebija taisnība Bourne raķetēs (kā īstajā Bourne čaulā, nevis modernās POSIX stila čaulās), taču mūsdienās ir maz ticams, ka jūs satiksit tik vecus šāviņus.

Tas darbojas jebkurā gadījumā, bet viņi nedara to pašu: PATH elementi tiek pārbaudīti no kreisās uz labo pusi. Pirmajā piemērā izpildāmos failus mapē ~/opt/bin būs prioritāte pār tiem, kas instalēti, piemēram, /usr/bin , kas var būt vai nebūt tas, ko vēlaties.

Īpaši no drošības viedokļa ir bīstami pievienot ceļus priekšpusē, jo, ja kāds var iegūt rakstīšanas piekļuvi jūsu ~/opt/bin , viņš, piemēram, var ievietot citus ls, kurus jūs, iespējams, izmantojat vietā / bin/ls nemanot Tagad iedomājieties to pašu, ko ssh vai jūsu pārlūkprogrammā vai izvēlē... (To pašu var izdarīt trīs reizes jūsu ceļā.)

Mani mulsina 2. jautājums (jo tas tika noņemts no jautājuma, jo tas bija saistīts ar nesaistītu problēmu):

Kas efektīva metode vai pievienot papildu ceļus dažādām līnijām? Sākumā es domāju, ka tas varētu palīdzēt:

Eksportēt PATH=$PATH:~/opt/bin eksportēt PATH=$PATH:~/opt/node/bin

bet tas nenotiek, jo otrais uzdevums ne tikai pievieno ~/opt/node/bin, bet arī visu iepriekš piešķirto PATH .

Šis ir iespējamais risinājums:

Eksportēt PATH=$PATH:~/opt/bin:~/opt/node/bin

bet lasāmības labad es labprātāk izvēlētos vienu galamērķi katram ceļam.

Ja jūs sakāt

PATH=~/opt/bin

Šis Visi, kas būs tavā CEĻĀ. PATH ir tikai vides mainīgais, un, ja vēlaties pievienot PATH, jums ir jāpārveido mainīgais ar tieši tādu saturu, kādu vēlaties. Tātad tas, ko jūs sniedzat kā piemēru 2. jautājumā, ir tieši tas, ko vēlaties darīt, ja vien es pilnībā nepalaidu garām jautājuma būtību.

Es savā kodā 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 iekļautu potenciāli trūkstošos direktorijus:

Eksportēt PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # pievienojiet izvēles vienumus bindir ceļam mapē $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; tad PATH=$PATH:$(bindir) fi darīts

Linux nosaka izpildāmā meklēšanas ceļu no $PATH vides. Lai $PATH vides augšpusē pievienotu direktoriju /data/myscripts, izmantojiet šo:

PATH=/data/myscripts:$PATH

Lai pievienotu šo direktoriju ceļa beigām, izmantojiet šo komandu:

PATH=$PATH:/data/myscripts

Taču ar iepriekšējiem nepietiek, jo, iestatot vides mainīgo skriptā, šīs izmaiņas stājas spēkā tikai skriptā. Šis ierobežojums ir ierobežots tikai divos veidos:

  • Ja eksportējat vides mainīgo skriptā, tas ir efektīvs visās programmās, kuras izsauc skripts. Ņemiet vērā, ka tas nav efektīvs programmā, ko sauc par skriptu.
  • Ja programma, kas izsauc skriptu, to dara, iekļaujot, nevis izsaucot, visas vides izmaiņas skriptā ir spēkā izsaucošajā programmā. Šo iekļaušanu var veikt, izmantojot komandu dot vai avota komandu.

$HOME/myscript.sh avots $HOME/myscript.sh

Iekļaušana pamatā ietver "izsaucamo" skriptu "zvana" skriptā. Tas ir līdzīgi kā #include C. Tātad tas ir efektīvs skriptā vai izsaukšanas programmā. Bet, protams, tas nav efektīvs programmām vai skriptiem, ko izsauc izsaucošā programma. Lai tas būtu efektīvs līdz pat zvanu ķēdei, jums ir jāievēro vides mainīgā iestatījums, izmantojot eksportēšanas komandu.

Piemēram, bash čaulas programmā ir iekļauts faila .bash_profile saturs. Tātad, pievienojot .bash_profile šādas 2 rindiņas:

PATH=$PATH:/data/myscripts eksportē PATH

efektīvi ievieto šīs 2 koda rindiņas bash programmā. Tādējādi iekšā bash mainīgais$PATH ietver $HOME/myscript.sh, un eksportēšanas paziņojuma dēļ visām programmām, kuras izsauc bash, tiks modificēts $PATH. Un tā kā visas programmas, kas tiek palaistas no bash uzvednes, tiek izsauktas ar bash, jaunais ceļš ir derīgs visam, ko palaižat no bash uzvednes.

Būtība ir tāda, ka, lai ceļam pievienotu jaunu direktoriju, čaulā iekļautajā skriptā ir jāpievieno vai jāpievieno direktorijs vides mainīgajam $PATH, kā arī jāeksportē vides mainīgais $PATH.

Papildus informācijaŠeit

Kādu laiku man ir divas funkcijas pathadd un pathrm, kas palīdz ceļam pievienot elementus, neuztraucoties par dublēšanos.

pathadd izmanto vienu ceļa argumentu un neobligātu pēc argumenta, kas, ja tiek pievienots, tiks pievienots PATH, pretējā gadījumā tas tiks pievienots.

Gandrīz katrā situācijā, ja pievienojat ceļu, iespējams, vēlaties ignorēt visu, kas jau atrodas ceļā, tāpēc es dodu priekšroku pievienošanai pēc noklusējuma.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; tad ja [ " $2" = "pēc" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

Ievietojiet tos jebkurā skriptā, kurā vēlaties mainīt PATH vidi, un tagad varat to izdarīt.

Pathadd "/foo/bar" pathadd "/baz/bat" pēc PATH eksportēšanas

Jūs garantējat, ka nepievienosit ceļu, ja tas jau pastāv. Ja tagad vēlaties, lai /baz/bat būtu sākumā.

Pathm "/baz/bat" ceļš pievieno "/baz/bat" eksportēšanas PATH

Jebkuru ceļu tagad var novest uz priekšu, ja tas jau ir ceļā bez dubultošanas.

Es nevaru runāt par citiem izplatījumiem, bet Ubuntu ir fails /etc/environment, kas ir standarta meklēšanas ceļš visiem lietotājiem. Tā kā datoru lietoju tikai es, es savā ceļā ievietoju jebkurus direktorijus, ko vēlos, ja vien tas ir pagaidu papildinājums, ko ievietoju skriptā.

Šeit ir mans risinājums:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\(1\)/\1 /")

Jauks viegls laineris, kas neatstāj pēdas:

Man (operētājsistēmā Mac OS X 10.9.5) ceļa nosaukuma (piemēram, /mypathname) pievienošana failam /etc/paths darbojās ļoti labi.

Pirms rediģēšanas tiek atgriezta atbalss $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Pēc /etc/paths rediģēšanas un čaulas restartēšanas mainīgais $PATH tiek pievienots ar /pathname . Patiešām, atbalss $PATH atgriež:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Notika tas, ka /mypathname tika pievienots $PATH.

Lai PATH videi PATH pievienotu jaunu ceļu:

Eksportēt PATH=$PATH:/jauns-ceļš/

Lai šīs izmaiņas attiektos uz katru atvērto čaulu, pievienojiet to failam, kuru čaula izsauks, kad to izsaucat. Dažādos apvalkos tas varētu būt:

  • Bash Shell: ~/.bash_profile, ~/.bashrc vai profils
  • Korn Shell: ~/.kshrc vai .profile
  • Z Shell: ~/.zshrc vai .zprofile

Piemēram

# eksports PATH=$PATH:/root/learning/bin/ # avots ~/.bashrc # atbalss $PATH

Iepriekš norādītajā izvadē varat redzēt norādīto ceļu.

Visiem Linux failiem failu sistēmā ir noteikta adrese, ar kuru mēs varam tiem piekļūt, izmantojot failu pārvaldnieku vai konsoles utilītas. Šī ir diezgan vienkārša tēma, taču daudziem iesācējiem ar to ir grūtības.

Šodienas īsajā rakstā mēs apskatīsim, kāds ir ceļš uz Linux failu, kāds tas var būt, kā to pareizi uzrakstīt un daudz ko citu. Ja jums bija grūtības ar to iepriekš, tad pēc raksta izlasīšanas viss kļūs pilnīgi skaidrs.

Failu ceļi operētājsistēmā Linux

Linux failu sistēma ļoti atšķiras no Windows. Mēs neņemsim vērā tā struktūru; tas tika darīts agrāk. Mēs koncentrēsimies uz darbu ar failiem.

Būtiskākā atšķirība ir tā, ka faila adrese sākas nevis no diska, piemēram, C:\ vai D:\, kā tas notiek sistēmā Windows, bet gan no saknes, saknes sistēmas direktorija, kurai ir pievienoti visi pārējie. Viņa adrese - /. Un šeit ir jārunā par adresēm. Linux failu ceļos tiek izmantota slīpsvītra “/”, lai adresē atdalītu direktorijus, un tas atšķiras no tā, ko esat pieradis redzēt operētājsistēmā Windows — \.

Piemēram, ja iekšā Windows pilnas ceļš uz failu darbvirsmā izskatījās šādi: C:\Users\Sergiy\Desktop\, tad faila ceļš operētājsistēmā Linux būtu vienkārši /home/sergiy/desktop/. Līdz šim viss ir vienkāršs un skaidrs. Bet problēmas rodas tālāk.

Operētājsistēmā Linux var būt vairāki failu ceļu veidi. Apskatīsim, kādi ceļi pastāv Linux:

  • Pilns, absolūts Linux ceļš no failu sistēmas saknes- jūs jau esat redzējis šo ceļu iepriekš minētajā piemērā, tas sākas no saknes “/” un apraksta visu ceļu uz failu;
  • Linux relatīvais ceļš- šis ir ceļš uz failu attiecībā pret pašreizējo mapi; šādi ceļi bieži rada neskaidrības.
  • Ceļš attiecībā pret pašreizējā lietotāja mājas mapi.- ceļš failu sistēmā, bet ne no saknes, bet gan no pašreizējā lietotāja mapes.

Tagad apskatīsim tuvāk, kā šie ceļi izskatās operētājsistēmā Linux, kā arī apskatīsim dažus piemērus, lai tas būtu pilnīgi skaidrs. Demonstrācijai izmantosim utilītu ls, kas paredzēta direktoriju satura apskatei.

Piemēram, mūsu mājas mapē ir šāds direktorijs ar četriem failiem:

Šādi izskatīsies pilns Linux ceļš uz kādu no failiem:

ls /home/sergiy/tmp/file1

Tas jau ir relatīvs Linux ceļš, kas sākas no mājas mapes, tas ir apzīmēts ar ~/. Ņemiet vērā, nevis ~, proti, ~/. Tad jūs varat norādīt apakšmapes, mūsu gadījumā tmp:

Nu vai faila ceļš operētājsistēmā Linux attiecībā pret pašreizējo mapi:

Pirmā saite norāda uz pašreizējo mapi (.), otrā (..) norāda uz augstāku mapi. Tas paver vēl lielākas katalogu navigācijas iespējas. Piemēram, lai atsauktos uz failu pašreizējā mapē, varat izmantot šādu konstrukciju:

Tas nav noderīgi, skatot faila saturu. Bet tas ir ļoti svarīgi, izpildot programmu. Jo programma vispirms tiks meklēta PATH vidē un tikai pēc tam šajā mapē. Tāpēc, ja jums ir nepieciešams palaist programmu, kas atrodas pašreizējā mapē un to sauc tieši tāpat kā /bin direktorijā, tad bez skaidras saites jums ir jāmeklē fails pašreizējā mapē, nekas nedarbosies.

Šādas konstrukcijas var rasties diezgan bieži, kompilējot programmas. Jūs varat izmantot visus šos simbolus un linux failu ceļus ne tikai terminālī, bet arī jebkurā failu menedžeris, kas var būt ļoti ērti.

Bet Linux terminālis sniedz vēl lielākas iespējas. Varat izmantot vienkāršas aizstājējzīmes tieši failu vai direktoriju adresēs. Piemēram, varat uzskaitīt visus failus, kas sākas ar f:

Vai pat varat meklēt ne tikai mapē tmp, bet arī jebkurā mājas mapes apakšmapē:

Un tas viss darbosies, iespējams, tas ne vienmēr ir nepieciešams un praktiski. Bet dažās situācijās tas var ļoti palīdzēt. Šīs funkcijas ir ieviestas Bash čaulas līmenī, tāpēc varat tās izmantot jebkurā komandā. Apvalks aplūko, cik failu tika atrasts, un izsauc komandu katram no tiem.

secinājumus

Tas ir viss. Tagad jūs zināt visu, kas jums nepieciešams, lai ne tikai pareizi uzrakstītu ceļu linux fails, bet arī veikt sarežģītākas darbības, piemēram, meklēt failus vai pārvietoties pa direktorijiem, izmantojot komandu cd. Ja jums ir kādi jautājumi, jautājiet komentāros!

Saistītās ziņas:


Es domāju, kur jaunais ceļš jāpievieno PATH vides mainīgajam. Es zinu, ka to var paveikt, rediģējot .bashrc (piemēram,), bet nav skaidrs, kā to izdarīt.

Tādējādi:

Eksportēt PATH=~/opt/bin:$PATH

Eksportēt PATH=$PATH:~/opt/bin

11 atbildes

Vienkāršs materiāls

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

atkarībā no tā, vai vēlaties pievienot ~/opt/bin kodu beigās (lai meklētu visos citos direktorijos, ja vairākos direktorijos ir programma ar tādu pašu nosaukumu) vai sākumam (lai meklētu pirms visiem pārējiem direktorijiem).

Vienlaikus varat pievienot vairākus ierakstus. PATH=$PATH:~/opt/bin:~/opt/node/bin vai izmaiņas secībā ir piemērotas.

Jums nav nepieciešams eksportēt, ja mainīgais jau atrodas vidē: jebkuras izmaiņas mainīgā vērtībā tiek atspoguļotas vidē.¹ PATH gandrīz vienmēr atrodas vidē; visas unix sistēmas to instalē ļoti agri (parasti jau pašā pirmajā procesā).

Ja jūsu PATH ir izveidots ar daudziem dažādiem komponentiem, jūs varat iegūt dublētus ierakstus. Skatiet sadaļu Kā mājas direktorijam pievienot ceļu, kuru atklās Unix, kura komanda? un Noņemiet dublētos $PATH ierakstus, izmantojot komandu awk, lai izvairītos no dublikātiem vai noņemtu tos.

Kur likt

Ņemiet vērā, ka ~/.bash_rc nevar nolasīt neviena programma, un ~/.bashrc ir interaktīvo bash gadījumu konfigurācijas fails. Vides mainīgos nevajadzētu definēt failā ~/.bashrc. Pareizā vieta, kur definēt vides mainīgos, piemēram, PATH, ir ~/.profile (vai ~/.bash_profile, ja jums nepatīk čaulas, izņemot bash). Skatiet: Kāda ir atšķirība starp tām un kuru man vajadzētu izmantot?

Piezīmes par ne-bash apvalkiem

Programmā bash, ksh un zsh eksportēšana ir īpaša sintakse, un gan PATH=~/opt/bin:$PATH, gan eksportēšana PATH=~/opt/bin:$PATH rīkojas pareizi. Citos Bourne/POSIX apvalkos, piemēram, dash (kas daudzās sistēmās ir /bin/sh), eksportēšana tiek parsēta kā parasta komanda, kas nozīmē divas atšķirības:

  • ~ tiek parsēts tikai vārda sākumā, izņemot uzdevumus (skatiet Kā pievienot mājas direktorijas ceļu, ko atklās Unix, kam nepieciešama komanda? ;
  • $PATH ārējais dubultpēdiņas pārtrauc, ja PATH satur atstarpes vai \[*? .

Tātad čaulās, piemēram, domuzīme, eksportēšana PATH=~/opt/bin:$PATH iestata PATH uz burtisku virkni ~/opt/bin/:, kam seko PATH vērtība līdz pirmajai vietai. PATH=~/opt/bin:$PATH (vienkāršs uzdevums) neprasa pēdiņas un visu dara pareizi. Ja vēlaties izmantot eksportēšanu portatīvā skriptā, jums jāieraksta eksportēšanas PATH="$HOME/opt/bin:$PATH" vai PATH=~/opt/bin:$PATH eksporta PATH (vai PATH=$HOME/opt /bin: $PATH eksporta PATH pārnesamībai pat uz Bourne apvalku, kas nepieņem eksporta var=value un neveica tildes izvēršanu).

¹ Tā nebija taisnība Bourne apvalkos (kā faktiskajā Bourne apvalkā, nevis mūsdienu POSIX stila čaulās), taču mūsdienās ir maz ticams, ka jūs satiksit tik vecus apvalkus. Sub>

Jebkurā gadījumā tas darbojas, taču tie nedara vienu un to pašu: PATH elementi tiek pārbaudīti no kreisās puses uz labo. Pirmajā piemērā ~/opt/bin izpildāmie faili būs prioritāri pār tiem, kas instalēti, piemēram, /usr/bin , kas var būt vai nebūt tas, ko vēlaties.

Īpaši no drošības viedokļa ir bīstami pievienot ceļus priekšpusē, jo, ja kāds var iegūt rakstīšanas piekļuvi jūsu ~/opt/bin , viņš, piemēram, var ievietot citu ls, kuru jūs, iespējams, izmantosit /bin/ls vietā. nemanot. Tagad iedomājieties to pašu ssh vai jūsu pārlūkprogrammai vai izvēlei... (Tas pats trīs reizes tiek likts uz jūsu ceļa.)

Esmu neizpratnē par 2. jautājumu (jo tas tika noņemts no jautājuma, jo tas bija saistīts ar ne saistīta problēma):

Kāds ir efektīvs veids, kā dažādām līnijām pievienot papildu ceļus? Sākumā es domāju, ka tas varētu palīdzēt:

Eksportēt PATH=$PATH:~/opt/bin eksportēt PATH=$PATH:~/opt/node/bin

Bet tas nav tāpēc, ka otrais uzdevums ne tikai pievieno ~/opt/node/bin, bet arī iepriekš piešķirto PATH .

Šis ir iespējamais risinājums:

Eksportēt PATH=$PATH:~/opt/bin:~/opt/node/bin

Bet lasāmības labad es labāk vēlētos, lai katrs ceļš būtu viens galamērķis.

Ja jūs sakāt

PATH=~/opt/bin

Šis visi, kas būs jūsu CEĻĀ. PATH ir tikai vides mainīgais, un, ja vēlaties pievienot PATH, jums ir jāpārveido mainīgais ar tieši tādu saturu, kādu vēlaties. Tas ir, tas, ko jūs sniedzat kā piemēru 2. jautājumā, ir tieši tas, ko vēlaties darīt, ja vien es neesmu pilnībā palaidis garām jautājuma būtību.

Es savā kodā 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 mitinātu potenciāli trūkstošos direktorijus:

Eksportēt PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # pievienojiet izvēles vienumus bindir ceļam mapē $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; tad PATH=$PATH:$(bindir) fi darīts

Linux definē izpildāmo meklēšanas ceļu ar vides mainīgo $PATH. Lai vides mainīgā $PATH sākumam pievienotu direktoriju /data/myscripts, izmantojiet šo:

PATH=/data/myscripts:$PATH

Lai pievienotu šo direktoriju ceļa beigām, izmantojiet šo komandu:

PATH=$PATH:/data/myscripts

Taču ar iepriekšējiem nepietiek, jo, iestatot vides mainīgo skriptā, šīs izmaiņas stājas spēkā tikai skriptā. Šis ierobežojums ir ierobežots divos veidos:

  • Ja eksportējat vides mainīgo skriptā, tas ir efektīvs jebkurā programmā, ko izsauc skripts. Ņemiet vērā, ka tas nav efektīvs programmā, kas izsauca skriptu.
  • Ja programma, kas izsauc skriptu, to dara, iekļaujot, nevis izsaucot, visas vides izmaiņas skriptā ir spēkā izsaucošajā programmā. Šo iekļaušanu var veikt, izmantojot komandu dot vai avota komandu.

$HOME/myscript.sh avots $HOME/myscript.sh

Iekļaušana pamatā ietver "izsaucamo" skriptu "zvana" skriptā. Tas ir līdzīgi kā #include C. Tātad tas ir efektīvs skriptā vai izsaukšanas programmā. Bet, protams, tas nav efektīvs programmām vai skriptiem, ko izsauc izsaucošā programma. Lai tas būtu efektīvs līdz pat zvanu ķēdei, jums ir jāievēro vides mainīgā iestatījums, izmantojot eksportēšanas komandu.

Piemēram, bash čaulas programmā ir iekļauts faila .bash_profile saturs. Tāpēc .bash_profile ievietojiet šādas 2 rindiņas:

PATH=$PATH:/data/myscripts eksportē PATH

efektīvi ievieto šīs 2 koda rindiņas bash programmā. Tātad bash mainīgais $PATH ietver $HOME/myscript.sh, un eksportēšanas paziņojuma dēļ jebkuras bash izsauktās programmas ir mainīts mainīgais $PATH. Un tā kā visas programmas, kuras palaižat no bash uzvednes, izsauc bash, jaunais ceļš attiecas uz visu, ko palaižat no bash uzvednes.

Būtība ir tāda, ka, lai ceļam pievienotu jaunu direktoriju, čaulā iekļautajā skriptā ir jāpievieno vai jāpievieno direktorijs vides mainīgajam $PATH, kā arī jāeksportē vides mainīgais $PATH.

Jau kādu laiku esmu saglabājis divas funkcijas pathadd un pathrm, kas palīdz ceļam pievienot elementus, neuztraucoties par dublēšanos.

pathadd izmanto vienu ceļa argumentu un neobligātu pēc argumenta, kas, pievienojot, tiks pievienots PATH, pretējā gadījumā tas tiks pievienots.

Jebkurā situācijā, ja pievienojat ceļu, iespējams, vēlaties ignorēt visu, kas jau atrodas ceļā, tāpēc es dodu priekšroku pievienošanai pēc noklusējuma.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; tad ja [ " $2" = "pēc" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

Ievietojiet tos jebkurā skriptā, kuru vēlaties mainīt PATH vidē, un tagad esat pabeidzis.

Pathadd "/foo/bar" pathadd "/baz/bat" pēc PATH eksportēšanas

Jūs garantējat, ka nepievienosiet ceļu, ja tas jau pastāv. Ja vēlaties, lai vispirms tiktu palaists /baz/bat.

Pathm "/baz/bat" ceļš pievieno "/baz/bat" eksportēšanas PATH

Jebkuru ceļu tagad var pārvietot uz priekšu, ja tas jau atrodas ceļā bez dubultošanas.

Ložu necaurlaidīga pievienošanas/iepriekšsagatavošanas metode

Izvēloties pievienot un pievienot, ir jāņem vērā daudzi apsvērumi. Daudzas no tām ir ietvertas citās atbildēs, tāpēc es tās šeit neatkārtošu.

Svarīgi ir tas, ka pat tad, ja sistēmas skripti neizmanto šo (nez kāpēc) *1, tas ir nevainojams veids, kā pievienot ceļu (piemēram, $HOME/bin) vides mainīgajam PATH.

PATH="$(PATH:+$(PATH):)$HOME/bin"

lai pievienotu (nevis PATH="$PATH:$HOME/bin") un

PATH="$HOME/bin$(PATH:+:$(PATH))"

pievienot (nevis PATH="$HOME/bin:$PATH")

Tas ļauj izvairīties no nepareizas sākuma/beigu kolas, kad $PATH sākotnēji ir tukšs, kam var būt nevēlamas blakusparādības un tas var būt murgs (šī atbilde īsi attiecas uz awk-way gadījumu).

$(parametrs:+vārds)

Ja parametrs ir nulle vai nav iestatīts, nekas netiek aizstāts, pretējā gadījumā tas tiek aizstāts vārds vārds.

Tātad $(PATH:+$(PATH):) izvēršas līdz: 1) nekas, ja PATH ir nulle vai nav iestatīts, 2) $(PATH): ja PATH ir iestatīts.

Piezīme. Tas ir paredzēts bash.

*1 Es tikko atklāju, ka tādi skripti kā devtoolset-6/enable to izmanto, $ cat /opt/rh/devtoolset-6/enable # Vispārīgie vides mainīgie eksportē PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Es nevaru runāt par citiem izplatījumiem, bet Ubuntu ir fails /etc/environment, kas ir noklusējuma meklēšanas ceļš visiem lietotājiem. Tā kā manu datoru lietoju tikai es, es savā ceļā ievietoju visus vajadzīgos direktorijus, ja vien tas nav pagaidu papildinājums, ko ievietoju skriptā.

Man (operētājsistēmā Mac OS X 10.9.5) ceļa nosaukuma (piemēram, /mypathname) pievienošana failam /etc/paths darbojās ļoti labi.

Pirms rediģēšanas tiek atgriezta atbalss $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Pēc /etc/paths rediģēšanas un čaulas restartēšanas mainīgais $PATH tiek pievienots ar /pathname . Patiešām, atbalss $PATH atgriež:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Notika tas, ka /mypathname tika pievienots mainīgajam $PATH.