Pronalaženje komandi i okruženje
Kada otkucas komandu, terminal je ne nalazi magično — shell prolazi kroz listu direktorijuma i trazi izvrsni fajl. Ova lekcija objasnjava kako taj mehanizam radi i koje alate koristis da ga istrazis.
Kako shell pronalazi komandu — PATH
Svaki put kad ukucas komandu (npr. ls), shell trazi izvrsni fajl redom kroz direktorijume navedene u promenljivoj PATH:
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Direktorijumi su razdvojeni dvotackom (:). Shell ih pretrazuje s leva na desno — prvi pogodak pobedjuje. Ako se ime ne nadje ni u jednom direktorijumu, dobijas gresku command not found.
which — gde je izvrsni fajl
which pretrazuje PATH i vraca putanju do izvrsnog fajla:
which ls
# /usr/bin/ls
which python3
# /usr/bin/python3
which nano
# /usr/bin/nano
Ako komanda nije u PATH-u, which ne ispisuje nista i vraca izlazni kod razlicit od nule.
whereis — sira pretraga
whereis ne gleda samo PATH — trazi i izvorni kod i man stranice:
whereis grep
# grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz
whereis bash
# bash: /usr/bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
whereis ls
# ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
Korisno kada zelis da vidis i lokaciju dokumentacije uz binarni fajl.
type — kako shell tumaci komandu
type je mocniji od which jer otkriva sta shell zapravo radi sa datim imenom — da li je to alias, ugradjeni (builtin) bash, funkcija ili putanja do fajla:
type ls
# ls is aliased to 'ls --color=auto'
type cd
# cd is a shell builtin
type which
# which is /usr/bin/which
type ll
# ll is aliased to 'ls -la'
type if
# if is a shell keyword
Ovo je najkorisnija komanda za debug situacije "zasto se moja komanda ponasa cudno?".
Razlika which vs type
which gleda samo PATH — vidi izvrsne fajlove, ali ne i aliase, builtine ili funkcije. type vidi sve cetvoro i otkriva sta ce shell zaista pokrenuti.
which ls
# /usr/bin/ls
type ls
# ls is aliased to 'ls --color=auto'
which pokazuje originalni fajl, ali type otkriva da imas alias koji menja ponasanje. Ako ls daje boje, a zelis originalni izlaz, koristis \ls da zaobidjes alias.
env i printenv — promenljive okruzenja
Svaki proces ima skup promenljivih okruzenja (environment variables) koje uticu na njegovo ponasanje.
# Prikaži sve promenljive okruzenja
env
# Prikaži vrednost jedne promenljive
printenv HOME
# /home/student
# Prikaži vise promenljivih odjednom
printenv USER PATH
# student
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Najvaznije promenljive:
| Promenljiva | Opis |
|---|---|
PATH |
Direktorijumi za pretrazivanje komandi |
HOME |
Tvoj home direktorijum |
USER |
Tvoje korisnicko ime |
SHELL |
Aktivni shell (/bin/bash) |
LANG |
Jezicke postavke |
PWD |
Trenutni direktorijum |
PATH u praksi — dodavanje direktorijuma
Ako instaliras program u nestandardni direktorijum, shell ga nece naci dok ne dodas taj direktorijum u PATH:
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Dodaj direktorijum na pocetak PATH-a (ovaj session)
PATH="/opt/moji-alati:$PATH"
echo $PATH
# /opt/moji-alati:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Sada shell prvo trazi u /opt/moji-alati. Da bi promena bila trajna, dodaj je u ~/.bashrc.
Rezime
| Komanda | Sta radi |
|---|---|
which komanda |
Putanja do izvrsnog fajla u PATH-u |
whereis komanda |
Binarni fajl, izvorni kod i man strana |
type komanda |
Kako shell tumaci ime (alias/builtin/putanja) |
env |
Sve promenljive okruzenja |
printenv VAR |
Vrednost jedne ili vise promenljivih |
echo $PATH |
Direktorijumi za pretrazivanje komandi |