Which
Autor
Sven Rekkaro AK21
Sügis 2014
Sissejuhatus
which
on lihtne käsk, mis võimaldab leida käsu või skripti käivitusfaili täispika tee, kui see asub ühes süsteemi või kasutaja kaustadest, mis on kirjeldatud keskkonnamuutujas $PATH. Kui kasutaja sisestab Linuxi käsureale käsu, siis kontrollib Linuxi shell $PATH keskkonnamuutujas kirjeldatud kaustadest sisestatud käsule vastava käivitusfaili olemasolu. Kui sobivat käivitusfaili ei leita, siis kuvatakse veateade "command not found," käivitusfaili olemasolu korral see käivitatakse. Analoogselt Linuxi shellile toimib ka käsklus which
, mis tagastab sisestatud käsu täispika tee, kui käivitusfail leitakse või tagastab veateate kui käsule on lisatud mitte-eksisteeriv võti. Programm ei kontrolli $PATH muutujas kirjeldatud kaustades asuvaid nimelinke.
Programmil on Debiani baasil Linuxi distributsioonides kolm tagastusväärtust:[1]
- 0 - argumendile vastav käivitusfail leiti.
- 1 - argumendile vastavat käivitusfaili ei leitud.
- 2 - käsk sisestati koos vigase võtmega.
Teistel Unixi-laadsetel süsteemidel on tagastusväärtuseid kaks [2]:
- n - argumentide arv, millele sobiva vaste leidmine ei õnnestunud.
- -1 - käsklus sisestati ilma argumendita
Käsu süntaks
Käsu which
süntaks erineb mõningal määral, olenevalt kasutatavast Linuxi (või mõne muu Unixi-laadse) distributsioonist. Vähemate võimalustega on käsklus Debianil põhinevatel Linuxitel [1]. Keerukam on käsu süntaks teistel Unixil põhinevatel operatsioonisüsteemidel, näiteks Linuxi distributsioonil Gentoo [2]. Käsu kasutamiseks piisab tavakasutaja õigustest.
Süntaks Debianil põhinevatel Linuxitel
which [võtmed] argument
Käsu
which
argumendiks on programmi, skripti või käsu nimetus. Argumente võib which
käsu järele sisestada mitu. [1]
Võtmed:
-a
Prindib välja kõikide argumentide kõik leitud täispikad teed. Ilma võtmeta "-a" prinditakse ainult esimene leitud vaste.
Süntaks teistel Unixi-laadsetel operatsioonisüsteemidel
which [võtmed] [--] argument
Erinevalt Debianist on kasutatavate võtmete hulk oluliselt suurem. Argumendiks on otsitava käsu, skripti või programminimi. Argumente võib olla mitu. Tulemus tagastatakse iga argumendi kohta eraldi. [2]
--all, -a
Prindib ekraanile kõik sobivad täispikad teed, mis $PATH muutujas kirjeldatud kataloogidest leiti.
--read-alias, -i
Loeb aliased standardsisendist (stdin), tagastab sobivad vasted standardväljundile (stdout). Kasulik võti näiteks siis, kui käsu which
enda jaoks on kasutusel alias: alias which=?alias | which -i?
--skip-alias
Ignoreerib võtit: --read-alias
, kui see peaks olema aktiivne. Kasulik kui otsitakse algseid käivitusfaile ning samal ajal on which
käsklus koos võtmega --read-alias
kasutusel aliase või funktsiooni osana.
--read-functions
Kasutab shelli funktsiooni sisendite defineerimiseks standardsisendit (stdin), väljastab sobivad vasted standardväljundil (stdout). Kasulik kombinatsioon, kui kasutatakse shelli funktsiooni which
käsu enda jaoks. Näiteks:
which() { declare -f | which --read-functions $@ }
export -f which
--skip-functions
Ignoreerib valikud --read-functions
, kui see peaks olemas sisestatud. Kasulik, kui otsitakse konkreetselt binaarfaile, samal ajal, kui on aktiivne read-functions?
võti which funktsiooni või aliase seadistuses.
--skip-dot
Käsk ignoreerib $PATH keskkonnamuutujas kirjeldatud punktiga algavaid kaustu.
--skip-tilde
Käsk ignoreerib $PATH keskkonnamuutujas kirjeldatud kaustu, mis alavad tildega ja binaarfaile, mis asuvad HOME kataloogis.
--show-dot
Kui kaust $PATH muutujas algab punktiga ja otsitav käivitusfail asub antud kataloogis, siis väljastatakse ekraanile "./programminimi
," selle asemel, et kuvada faili täispikka teed.
--show-tilde
Väljastab tilde, kui otsingutulemus asub "HOME" kataloogis. Antud valikut ignoreeritakse, kui käsk on väljakutsutud juurkasutajana.
--tty-only
Peatab võtmete protsessimise, kui need ei pärine tty terminalilt.
--version,-v,-V
Väljastab standardväljundile (stdout) which
programmi versiooni informatsiooni.
--help
Väljastab standardväljundile programmi kasutusjuhendi, mis on analoogne which
manualiga.
Näited
Kuna which
käsu süntaks on olenevalt Linuxi distributsioonist erinev, siis on allpool eraldi väljatoodud näited nii Debian (lihtsam) Linuxi, kui ka Gentoo (keerukam) Linuxi kohta.
Näited Debiani baasil
Ühe programmi käivitusfaili otsimiseks:
which fdisk
Ekraanile tagastatakse tulemus:
/sbin/fdisk
Otsingut võib teostada ka mitme programmi kohta üheaegselt:
which fdisk ifconfig make mkdir
Tulemus ekraanil:
/sbin/fdisk /sbin/ifconfig /usr/bin/make /bin/mkdir
Kõikide asukohtade ekraanile kuvamiseks tuleb kasutada võtit -a
:
which -a less
Tulemus:
/usr/bin/less /bin/less
Näited Gentoo baasil
Ühe programmi otsimine:
which which
Tagastab tulemuse:
/usr/bin/which
Mitme programmi otsimine:
which man cp mkdir ifconfig
Tulemus:
/usr/bin/man /usr/bin/cp /usr/bin/mkdir /sbin/ifconfig
Sarnaselt Debianile toimib ka võti -a
või --all
, mis tagastab kõik positiivsed otsingutulemused:
which --all nano
Tagastab tulemuse:
/usr/bin/nano /bin/nano
Kui otsida programmi, mis ei asu keskkonnamuutujas $PATH kirjeldatud kaustades, siis tagastab programm, erinevalt Debiani baasil süsteemidest, veateate iga argumendi, mida ei leitud, kohta.
which minuprogramm
Tulemus veateate näol:
which: no minuprogramm in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/4.1.1:/usr/i686-pc-linux-gnu/gcc-bin/4.1.2)
which
kasutamise näide C shelli aliasena või Bourne shelli funtsioonina [2]:
[ba]sh: which () { (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@ } export -f which
[t]csh: alias which ?alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde?
Aliase/shelli funktsiooni näite tulemus käsu which
käsurealt käivitamisel. Programmi asukoht näidatakse ekraanil vastavalt ~/programminimi
või ./programminimi
, kui programmi käivitusfail asub, kas kasutaja kodukataloogis või mõnes peidetud kataloogis:
which q2 ~/bin/q2
Aliase/shelli funktsiooni näite tulemus, kui käsku which
kasutatakse mõne skripti koosseisus. Tulemuse väljastatakse täispika teena:
echo `which q2` /home/carlo/bin/q2
Kokkuvõte
which
on oluline abivahend erinevate programmide ja skriptide käivitusfailide leidmisel arvutist. which
võimaldab aega kokku hoida: kasutaja või administraator ei pea käsitsi erinevatest kaustadest käivitusfaile otsima või otsingu tulemusi analüüsima. which
kiirendab süsteemi ülesehitusest ettekujutuse tekkimist süsteemiadministraatori või kasutaja jaoks.
Debianil baseeruvatel Linuxi distributsioonidel on mindud käsu lihtsutamise teed ning alles on jäetud vaid -a
võti. Sellega tagatakse programmi kasutusmugavus tavakasutajale- lakooniline kasutusjuhend ei hirmuta kasutajat ära. Samas on piiratud käsu funktsionaalsust.
Teistel Unixi-laadsetel operatsioonisüsteemidel on käsu igapäevane tavakasutaja funktsionaalsus analoogne Debiani süsteemidega. Samas on tagatud erinevate täiendatavate võtmete ja valikute kasutamise võimalus aliastes ning shelli funktsioonides.
Koos käskudega whatis
ja whereis
moodustab which
ideaalse "tööriista" komplekti Linuxi käsurea vahendusel programmide, skriptide ja juhendite leidmiseks. [3]
Kasutatud kirjandus
[2] http://unixhelp.ed.ac.uk/CGI/man-cgi?which
[3] http://www.thegeekstuff.com/2013/04/linux-which-whatis-whereis/
[4] http://www.cyberciti.biz/faq/unix-linux-which-command-examples-syntax-to-locate-programs/