Citat:
E sad ova jedna tacka oznacava trenutni direktorijum a dve tacke oznacavaju direktorijum ispod da ne kazem parent direktorijum.
Ajde, i ja ću da se nadovežem, pa da objasnim i onima koji malo više znaju kako taj mehanizam funkcioniše „ispod haube”.
Naime, pri kreiranju novog praznog direktorijuma komandom mkdir(1) (ili, preciznije, korišćenjem mkdir(2) sistemskog poziva), on zapravo i nije prazan. U njemu se stvaraju dva fajla, „.” i „..”. E sad, ono što mnogi možda ne znaju je to da ovi fajlovi nisu nikakva posebna vrsta fajlova, nikakvi imaginarni ili nepostojeći fajlovi, u pitanju su najobičniji „hard" linkovi na tekući direktorijum i direktorijum ispod. Ovo možemo lako empirijski proveriti (switch „-d” služi da ne bi prikazali sadržaj ako je argument direktorijum):
Code:
random@amber:~$ mkdir prazan
random@amber:~$ ls -ld prazan
drwxr-xr-x [b]2[/b] random None 0 Aug 30 23:51 prazan
random@amber:~$
Obratite pažnju na drugu kolonu u ispisu komande ls -l, u pitanju je kao što znamo, broj hard linkova na dati fajl. Naravno, jedan hard link uvek mora da postoji, to je pokazivač na fajl u roditeljskom direktorijumu, i u slučaju regularnih fajlova, ovaj broj je najčešće 1, ali u slučaju direktorijuma (ne zaboravimo da je i direktorijum ništa drugo nego posebna vrsta fajla), inicijalno je 2 — pokazivač na dotični poddirektorijum u roditeljskom direktorijumu (prazan) i pokazivač na samog sebe u dotičnom direktorijumu (.).
Odvedimo sad ovo za korak dalje: ako pogledamo neki direktorijum koji sadrži puno poddirektorijuma:
Code:
random@amber:~$ ls -ld /usr
drwxr-xr-x 15 random None 0 Jul 19 01:57 /usr
random@amber:~$
U ovom slučaju, na /usr direktorijum postoji čak 15 hard-linkova — u pitanju su pokazivač iz roditeljskog direktorijuma (usr), pokazivač na samog sebe (.), i pokazivači na roditeljski direktorijum (..) iz njegovih 13 poddirektorijuma.
Ova cifra, naravno, nije uvek jednaka 2 + broj poddirektorijuma, ovaj broj može da se poveća kreiranjem „hard” linkova na dotični direktorijum komandom ln(1). Doduše u praksi se obični linkovi ređe koriste, jer simbolički imaju par prednosti nad njima, ali o tome u idućoj epizodi ;o).
Vezano za temu, ako u direktorijumu imamo izvršni fajl, recimo „a.out”. U shellu kucamo
$ ls a.out
a.out
$ a.out
a.out: not found
Problem je u tome što kada u komandi nemamo nijedan znak „/”, shell pretražuje redom listu direktorijuma u PATH promenljivoj (sadržaj iste možemo videti komandom „echo $PATH”) i pokušava da izvrši komandu <dir>/a.out, gde je <dir> jedan od direktorijuma iz PATH promenljive. Stoga, ako tekući direktorijum nije u PATH promenljivoj (a obično nije), komanda neće biti nađena. Ako program pozovemo sa ./a.out, time smo eksplicitno naznačili putanju do fajla, pa će ga shell pronaći.
Ovakvo ponašanje shell-a možemo promeniti dodavanjem pokazivača na tekući direktorijum na kraj PATH liste:
export PATH=$PATH:. (u Bourne shellu)
tj.
setenv PATH $PATH:. (u C shellu)
Stavite ovo u ~/.profile i dobićete ponašanje slično DOS-u, izvršavanje fajlova iz tekućeg direktorijuma navođenjem samo imena.
Ovo ću da stavim u Linux FAQ... Mada je zapravo za UNIX FAQ.
int rand(void);
Those who do not understand Unix are condemned to reinvent it, poorly.
Upali lampicu — koristi Jabber!