Gym
lesson

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