Како користити команду вхицх на Линуку

Linux komanda koja identifikuje izvršnu binarnu datoteku koja se pokreće kada unesete komandu u ljusci. Ukoliko imate različite verzije istog programa na vašem računaru, možete koristiti *which* da biste utvrdili koju verziju će ljuska koristiti.

Binarne datoteke i putanje

Kada pokušate da pokrenete program ili komandu iz terminala, ljuska (najčešće Bash na modernim distribucijama) treba da locira tu komandu i pokrene je. Neke komande, kao što su cd, history i pwd, ugrađene su u samu ljusku, tako da Bash ne mora mnogo da se trudi da bi ih pronašao.

Ali kako Bash pronalazi ostale komande, programe i spoljne samostalne binarne datoteke? Bash koristi putanju, koja je zapravo skup putanja, a svaka od njih ukazuje na direktorijum. Zatim, u svakom od tih direktorijuma, traži izvršnu datoteku koja odgovara komandi ili programu koji pokušavate da pokrenete. Kada je pronađe, Bash je pokreće i prekida dalju pretragu.

Možete upotrebiti *echo* da biste proverili promenljivu okruženja $PATH i videli direktorijume koji se nalaze na vašoj putanji. Da biste to uradili, otkucajte sledeće, a zatim pritisnite Enter:

echo $PATH

Izlazna lista razdvaja svaku putanju dvotačkama (:). Na računaru koji koristimo, Bash će pretraživati sledeće direktorijume ovim redosledom:

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

Postoji veliki broj direktorijuma pod nazivom /sbin i /bin u sistemu datoteka, što može stvoriti određenu zabunu.

Posmatranje putanja

Recimo da imamo ažuriranu verziju programa pod nazivom htg. Ona se nalazi u našem trenutnom direktorijumu i možemo je pokrenuti upisivanjem sledeće komande:

./htg

To nije neki poseban program – samo ispisuje broj verzije i potom se zatvara. Nova verzija je 1.2.138.

Da biste pokrenuli program u trenutnom radnom direktorijumu, morate uneti „./“ ispred naziva programa, kako bi Bash znao gde da ga pronađe.

Pošto želimo da pokrenemo ovaj određeni program iz bilo kog direktorijuma, premestićemo izvršnu datoteku u direktorijum /usr/bin. Bash će pronaći taj program na putanji i pokrenuti ga za nas.

Više nam ne treba izvršna datoteka u našem trenutnom direktorijumu, niti treba da unosimo „./“ ispred naziva programa, kao što je prikazano u nastavku:

sudo mv htg /usr/bin

Sada, da pokušamo da pokrenemo program jednostavnim unosom:

htg

Nešto se dešava, ali to nije naš novi, ažurirani program. Umesto toga, to je starija verzija, 1.2.105.

*Which* komanda

Pitanje koje smo prikazali gore je razlog postojanja komande *which*.

U ovom primeru, koristićemo *which* i proslediti ime programa koji ispitujemo kao parametar komandne linije:

which htg

*which* prikazuje da je pronašao verziju programa htg u direktorijumu /usr/local/bin. Pošto se ta lokacija nalazi na putanji pre direktorijuma u koji smo premestili ažuriranu verziju programa htg, Bash koristi tu stariju verziju.

Međutim, ako upotrebimo opciju -a (all), kao što je prikazano u nastavku, *which* nastavlja da traži čak i ako pronađe prvo podudaranje:

which -a htg

Sada navodi sva podudaranja u bilo kojem od direktorijuma na putanji.

Dakle, problem je u tome što postoji starija verzija programa u direktorijumu koji se takođe nalazi na putanji. Taj direktorijum se pretražuje pre direktorijuma u koji smo postavili novu verziju programa.

Da bismo to proverili, možemo da otkucamo sledeće i eksplicitno pokrenemo svaku verziju programa:

/usr/local/bin/htg
/usr/bin/htg

Ovo objašnjava problem, a rešenje je jednostavno.

U stvari, imamo nekoliko opcija. Možemo ili izbrisati staru verziju u direktorijumu /usr/local/bin ili je premestiti iz /usr/bin u /usr/local/bin.

Analiza rezultata

Dva rezultata ne moraju nužno da znače dve binarne datoteke.

Pogledajmo primer u kojem ćemo upotrebiti *which* komandu sa opcijom -a (all) i potražiti verzije programa less:

which -a less

*which* prikazuje dve lokacije na kojima se nalazi verzija programa less, ali da li je to tačno? Bilo bi neobično imati dve različite verzije (ili istu verziju na više lokacija) programa less instalirane na Linux računaru. Dakle, nećemo odmah prihvatiti izlaz komande *which*. Umesto toga, hajde da istražimo malo dublje.

Možemo koristiti opcije *ls*, -l (duga lista) i -h (čitljivo) da vidimo šta se zapravo dešava:

ls -lh /usr/bin/less

Veličina datoteke je prikazana kao devet bajtova! To definitivno nije potpuna kopija programa less.

Prvi znak liste je „l“. Normalna datoteka bi imala crticu (-) kao prvi znak. „l“ je simbol koji označava simboličku vezu. Ako ste propustili taj detalj, simbol –> takođe označava da je ovo simbolička veza, što možete zamisliti kao neku vrstu prečice. Ova veza ukazuje na kopiju programa less u /bin.

Hajde da pokušamo ponovo sa verzijom programa less u /bin:

ls -lh /bin/less

Ovaj unos je očigledno „prava“ binarna izvršna datoteka. Prvi znak liste je crtica (-), što znači da je obična datoteka, a veličina datoteke je 167 KB. Dakle, instalirana je samo jedna kopija programa less, ali postoji simbolička veza do nje iz drugog direktorijuma, koju Bash takođe pronalazi prilikom pretraživanja putanje.

Provera više komandi odjednom

Možete proslediti više programa i komandi komandi *which*, a ona će ih proveriti po redosledu.

Na primer, ako otkucate:

which ping cat uptime date head

*which* prolazi kroz listu programa i komandi koje ste mu prosledili i prikazuje rezultate za svaki od njih.

Šta je *which*?

Ako želite, možete proveriti i samu komandu *which* tako što ćete otkucati sledeće:

which which

Osim radoznalog istraživanja Linux sistema datoteka, *which* je najkorisniji kada očekujete jedan skup ponašanja od komande ili programa, a dobijete drugi.

Možete koristiti *which* u tim slučajevima da biste proverili da li je komanda koju Bash pokreće ona koju zaista želite da koristite.