Ákvað að taka aðeins saman þessa uppsetningu ef einhver getur nýtt sér.
Athugið að þetta nær aðeins yfir MacOS og Linux því miður en sama aðferð er notuð á Windows en ég hef ekki hugmynd um hvar hlutirnir þar eru staðsettir.
Orðið forrit í eftirfarandi samhengi á við kóða sem hefur verið þýddur(compile-aður) í keyranlega skrá. Orðið skel verður notað sem samheiti yfir allar helstu tegundir skelja sem eru í notkun (sh, bash, zsh, o.s.f.v.)
Keyranleg forrit í skelinni geta verið staðsett í hinum og þessum möppum. Þegar heiti á keyranlegri skrá er sleginn inn í skelinni þá þarf skráin að vera til staðar í möppunni sem heitið er slegið inn. Skelin reynir ekki að leita að skrá með þessu heiti á allri vélinni.
En það væri frekar glatað að þurfa að vita nákvæmlega hvar öll forrit væru staðsett og þurfa svo að auki að cd
-a sig inn í möppuna þar sem forritið væri til að keyra það.
Til að leysa þetta vandamál þá er slóðum að möppum sem innihalda keyranleg forrit safnað saman í einn langan streng og :
notaður til að aðskilja slóðirnar.
Dæmi:
/home/levy/.cargo/bin:/home/levy/.pyenv/bin:/home/levy/.yarn/bin:/home/levy/.poetry/bin:/home/levy/.nvm/versions/node/v14.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/usr/local/go/bin
Í hverri möppu í þessum langa streng eru eitt eða fleiri forrit sem hægt er að keyra með því að slá inn heitið á skránni sjálfri.
Skel er ekkert annað en forritunarumhverfi, þ.e. þið getið búið til breytur, for lykkjur og fleira í sh
(eða bash
) málinu. Í hvert sinn sem þið opnið skel þá fáiði gefins allskyns umhverfisbreytur (environment variables) sem skelin notar til að auðvelda sér lífið.
Ef þið opnið skel og skrifið env
þá sjáiði haug af breytum sem innihalda allskyns stillingar fyrir skelina. Ein af þessum breytum er PATH
(vísað í hana með $PATH
). Eins og kom fram ofar þá leitar skelin fyrst í möppunni sem þú ert staðsett/ur í þegar þú slærð inn heiti á forriti til að keyra. Ef skráin finnst ekki í möppunni þá er athugað í allar möppurnar sem eru í $PATH
strengnum. Þannig má keyra öll forrit sem eru uppsett á vélinni hvar sem þú ert í skráartrénu svo lengi sem full slóð að möppunni sem skráin er í sé í $PATH
strengnum.
Dæmi: Þið eruð líklega með annaðhvort Firefox eða Chrome á vélinni ykkar og þau má keyra beint úr skelinni eins og önnur forrit með því að slá inn heitið á keyranlegu skránum.
Getið byrjað að kanna hvar í skráartrénu þau eru:
which google-chrome
# eða
which firefox
# prentar út /usr/bin/firefox
Firefox á minni vél er í möppunni /usr/bin
og ef ég skoða $PATH
breytuna hérna að ofan þá er mappan þar. Ég veit því að skelinn getur keyrt þessa skrá hvar sem ég er skráartrénu. Ég þarf ekki að fara inn í möppuna fyrst.
# óþarfi því þessi mappa er í $PATH
cd /usr/bin
Þið getið svo prófað að keyra þetta beint úr skelinni:
google-chrome
eða
firefox
Ok, þá er það $CLASSPATH
sem er líka umhverfisbreyta en þarf að vera til staðar sérstaklega fyrir java
. Java veit slóðina að öllum standard klösum sem koma með uppsetningunni og við höfum verið að nota t.d. System
í System.out.print('foo')
. Ef við ætlum að bæta við pökkum sem fylgja ekki með í uppsetningunni og innihalda klasa sem við viljum nota, t.d. StdDraw
, þá þarf að segja Java hver slóðin að þeim er. Það má gera með því að setja slóðina í $CLASSPATH
umhverfisbreytuna eða setja slóðina sem option -cp
(classpath) þegar t.d. Ugla.java
er keyrð.
Sem dæmi þá myndi ég keyra skránna svona á minni vél:
java -cp /home/levy/code/java/libs/algs4.jar ~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni/java/src/Ugla.java
Eða stytta mér leið með því að nota tildu ~
sem er flýtileið að hæmasvæðinu mínu /home/levy
java -cp ~/code/java/libs/algs4.jar ~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni/java/src/Ugla.java
Við getum breytt og bætt við umhverfisbreytum eins og við viljum, rétt eins og við gerum í klösum og föllum sem við skrifum.
Ef t.d. $CLASSPATH
finnst ekki í skeljarumhverfinu þá myndi ég skilgreina breytuna og gefa henni slóðina að algs4.jar
skránni sem gildi:
export CLASSPATH=~/code/java/libs/algs4.jar
Athugum hvort hún sé kominn inn:
env
Hún ætti að birtast þarna í hrúgunni einhverstaðar.
Getum líka athugað hvort einhver tiltekin breyta sé til staðar:
echo $CLASSPATH
Við ættum að fá útprentað gildið á henni.
Svona má setja hvað sem er sem umhverfisbreytu. Ég gæti t.d. set slóð á skilaverkefnamöppuna í TÖL sem umhverfisbreytu:
export TOL=~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni
Og nýtt mér svo hana til að drífa mig inn í möppuna án þess að skrifa þessa löngu slóð:
cd $TOL
En það eru betri leiðir til að gera þetta heldur en með breytum.
Stundum þarf líka að bæta við slóð í breytu sem er nú þegar til, t.d. $PATH
, því við viljum ekki stúta henni með nýju gildi, t.d. ef ég væri með keyranlegt forrit á einhverjum fönkí stað.
Gætum t.d. búið til breytu og gefið $PATH
nýtt gildi sem væri upprunalega gildið :
viðbótargildið.
TOL=~/Dropbox/hi/2021/vor/TOL203G/skilaverkefni
export PATH=$PATH:$TOL
Þegar við setjum umhverfisbreytu í skelina með þessum hætti þá lifir hún eingöngu eins lengi og skelin lifir, þ.e. hún hverfur ef þú lokar skelinni og hún verður aldrei til ef þú opnar nýja skel. Til að festa hana í öllum skeljum sem opnaðar eru þá þarf að setja hana í skrá sem er hlaðinn inn í hvert skipti sem ný skel er opnuð. Þessi skrá heitir misjöfnum nöfnum og oft eru þær nokkrar sem eru hlaðnar inn, þ.e. ein skrá importar annari.
Á Linux er það yfirleitt skráin .bash_profile
eða .bashrc
sem eru í heimamöppunni, þ.e. ~/.bash_profile
en á MacOS þá gæti hún heitið eitthvað annað, ~/.zshrc
mögulega þar sem Apple gerði zsh
að default skel í síðustu útgáfu, en ég veit það ekki.
Næst þegar skel er opnuð þá verða umhverfisbreyturnar aðgengilegar. Það má einnig keyra source
skipunina sem tekur skrá sem argument, og keyrir innihald skráarinnar. Þar sem export
er skipun sem tekur umverfisbreytu sem argument þá er línan export CLASSPATH=~/code/java/libs/algs4.jar
í skránni ~/.bashrc
ekkert annað en skipun sem er keyrð þegar skipunin source .bashrc
er keyrð.