Exit kodovi i lancane komande
Cilj ucenja: Nakon ove lekcije razumes sta je exit kod, kako ga proveris pomocu $?, i kako koristis &&, || i ; da lancas komande na osnovu toga da li su uspele ili ne.
Sta je exit kod?
Kada komanda zavrsi s radom, vraca exit kod (izlazni kod) — broj koji govori shellu da li je uspela ili ne.
Konvencija je jednostavna:
| Exit kod | Znacenje |
|---|---|
0 |
Uspeh |
1–255 |
Greska (razlicit broj za razlicit tip greske) |
Napomena: Ovo je suprotno od onoga na sta si mozda navikao/la u programiranju, gde je
0obicno "false". U shellu,0je uspeh (true), a svaki drugi broj je greska (false).
Kako proveriti exit kod — $?
Promenljiva $? uvek sadrzi exit kod poslednje pokrenute komande. Mozes je procitati odmah posle komande:
ls /home
echo $?
student
0
0 znaci uspeh. Probaj sa nepostojucim direktorijumom:
ls /nepostoji
echo $?
ls: cannot access '/nepostoji': No such file or directory
2
2 znaci greska — ls je vratio nenulti kod jer direktorijum ne postoji.
Svaki put kada pokrenes echo $?, vraca exit kod prethodne komande. Ako pokrenes echo $? dva puta zaredom, drugi ce prikazati exit kod prvog echo (obicno 0):
ls /nepostoji
echo $? # 2 (exit kod od ls)
echo $? # 0 (exit kod od prvog echo)
Operator && — pokreni sledecu samo ako uspe
Operator && (AND) pokrece drugu komandu samo ako prva vrati exit kod 0 (uspeh).
mkdir backup && cp vazno.txt backup/
- Ako
mkdir backupuspe (exit 0) →cpse pokrece - Ako
mkdir backupne uspe (exit != 0) →cpse ne pokrece
Zasto je ovo korisno? Sprecavas greske koje bi se desile ako bi prethodna komanda pala. Na primer, nema smisla kopirati u direktorijum koji nije uspesno kreiran.
Vise primera:
apt-get update && apt-get upgrade
# Upgrade se radi samo ako je update prosao
cd /opt/projekat && ./build.sh
# build.sh se pokrece samo ako smo uspesno usli u direktorijum
Operator || — pokreni sledecu samo ako padne
Operator || (OR) pokrece drugu komandu samo ako prva vrati nenulti exit kod (greska).
mkdir backup || echo "Direktorijum vec postoji ili nema dozvole"
- Ako
mkdir backupuspe →echose ne pokrece - Ako
mkdir backuppadne →echose pokrece i prikazuje poruku
Korisno za fallback akcije i jasne poruke o greskama:
ping -c1 8.8.8.8 &>/dev/null || echo "Upozorenje: nema pristupa internetu"
# Poruka se prikazuje samo ako ping nije uspeo
Operator ; — pokreni uvek, bez obzira na ishod
Tacka-zarez ; razdvaja komande koje se izvrsavaju sekvencijalno, bez obzira na exit kod:
date ; whoami ; pwd
sre maj 7 12:34:56 UTC 2026
student
/home/student
Sve tri komande se pokrecu jedna za drugom, bez provere da li je prethodna uspela. Za razliku od &&, ovde greska prve ne zaustavlja ostatak.
Prakticne upotrebe
Bezbedno brisanje — obrisati fajl samo ako postoji:
[ -f bekap.txt ] && rm bekap.txt
[ -f bekap.txt ] je test koji vraca 0 ako fajl postoji, ili 1 ako ne postoji. rm se pokrece samo ako fajl stvarno postoji.
Provera mreze sa porukom o stanju:
ping -c1 8.8.8.8 &>/dev/null && echo "Mreza OK" || echo "Nema mreze"
- Ako
pinguspe → "Mreza OK" - Ako
pingpadne → "Nema mreze"
Cest izvor zabune
&& nije isto sto & — Jedan & pokrece komandu u pozadini (background). Dva && su logicki AND koji proverava exit kod. Nemoj ih mesati.
komanda & # pokreni u pozadini (ne cekaj da zavrsi)
komanda1 && komanda2 # pokreni komandu2 samo ako komanda1 uspe
|| se aktivira kad god exit kod nije 0 — ne samo kad je tacno 1. Razlicite komande vracaju razlicite nenulte kodove za razlicite greske; || reaguje na sve njih.
Rezime
| Operator | Znacenje | Pokreni sledecu kad... |
|---|---|---|
&& |
AND | Prethodna uspela (exit 0) |
|| |
OR | Prethodna pala (exit != 0) |
; |
Sekvenca | Uvek (bez obzira na exit kod) |
$? |
Exit kod | — (promenljiva, ne operator) |