Motivacija
Kao inženjeri računarskih nauka, znamo da su računari odlična pomoć u zadacima koji se ponavljaju. Ipak, veoma često, zaboravljamo da se to jednako odnosi na našu upotrebu računara koliko i na radnje koje želimo da naši računari obave. Na raspolaganju nam je širok spektar alata koji nam pružaju mogućnost da budemo produktivniji i riješimo složenije probleme tokom rada na bilo kom problemu koji se tiče računara. Ipak, mnogi od nas koriste samo mali dio tih alata, znamo samo kako da se izborimo sa manjim problemima, i da ubacimo copy-paste komande sa interneta kada 'zaglavimo'.
Cilj ovih predavanja jeste da navedeni problem riješi.
Želimo da Vas naučimo kako da najbolje iskoristite alate koje znate, upoznamo Vas sa novim alatima, i nadamo se da postaknemo uzbuđenje kod vas za samostalno istraživanje (a možda i izradu više alata). To je ono za šta vjerujemo da je semestar koji nedostaje u većini nastavnih planova CS-a.
Struktura predavanja
Predavanje se sastoji od 11 lekcija koje traju 1 sat, a svaka se tiče određene teme. Lekcije su u velikoj mjeri nezavisne, a kako se semestar odvija, pretpostavićemo da ste upoznati sa sadržajem iz ranijih predavanja. Imamo zabilješke online, ali će biti dosta sadržaja koji će biti pokriven u lekcijama (npr. u formi demo-a) koji možda neće biti u zabilješkama. Lekcije ćemo snimati, i postaviti ih online.
Pokušaćemo da pokrijemo dosta toga tokom predavanja koje se sadrži od samo 11 lekcija koje traju 1 sat, tako da će lekcije biti prilično 'guste'. Da bi Vam pružili malo vremena da se upoznate sa sadržajem u Vašem sopstvenom ritmu, svaka lekcija sadrži set vježbi koje Vas vode kroz ključne tačke u lekciji. Nakon svake lekcije, ugostićemo Vas u kancelariji, gdje ćemo odgovoriti na sva potencijalna pitanja. Ako prisustvujete lekciji online, možete nam poslati pitanje na [email protected]
Uzimajući u obzir vrijeme kojim smo ograničeni, nećemo biti u mogućnosti da pređemo sve alate na istom nivou detalja kao što bio slučaj sa punim časovima. Gdje god je to moguće, pokušaćemo da Vas usmjerimo ka resursima sa dodatnim informacijama vezanim za alat ili temu, ali ukoliko Vam nešto posebno zapadne za oko, ne oklijevajte da nas kontaktirate i pitate za smjernice.
Tema 1: Shell
Šta je shell?
Računari danas imaju širok spektar interfejsa za zadavanje komandi, fensi grafički korisnički interfejs, glasovni interfejs, čak su i AR/VR svuda. Ovo su dobra rešenja za 80% slučajeva, ali su često suštinski ograničeni u pogledu toga što Vam omogućuju da radite - ne možete da pritisnete dugme koje nije tu ili da date glasovnu komandu koja nije programirana. Da bi iskusili sve mogućnosti koje alati Vašeg računara pružaju, moramo da koristimo stari način i upotrebimo tekstualni interfejs: Shell.
Gotovo sve platforme kojima imate pristup imaju shell u jednoj formi ili drugoj, a mnogi od njih imaju više shell-ova između kojih možete da birate. Dok postoje razlike u detaljima, oni su suštinski isti: dopuštaju vam da pokrenete programe, date inpute, i inspektuje njihov rezultat u polu-struktuiranom načinu.
U ovoj lekciji, fokusiraćemo se na Bourne Again SHell, ili skraćeno 'bash'. Ovo je jedan on najčešće korišćenih shell-ova, i njegova sintaksa je slična onome što ćete vidjete u mnogim drugom shell-ovima. Da bi otvorili shell prompt (gdje možete da kucate komande), prvo vam je potreban terminal. Vaš uredjaj je vjerovatno došao sa jednim pre-instaliranim, ili možete relativno lako da instalirate jedan.
Korišćenje shell-a
Kada pokrenete vaš terminal, vidjećete prompt koji obično izgleda ovako:
1
missing:~$
Ovo je glavni tekstualni interfejs shell-a. Govori vam da ste na mašini
1
missing
1 2 3
missing:~$ date Fri 10 Jan 2020 11:49:31 AM EST missing:~$
Ovdje, mi izršavamo date program, koji (možda na iznenadjenje) ispisuje trenutni datum i vrijeme. Shell vas zatim pita za drugu komandu za izvršavanje. Takođe, možemo izvršiti program sa argumentima:
1 2
missing:~$ echo hello hello
U ovom slučaju smo zadali shell-u da izvrši program
1
echo
1
hello
1
Echo
1
'
1
""
1
("My Photos")
1
\
1
(My\ Photos)
Ali kako shell zna kako da pronađe
1
datum
1
echo
1 2 3 4 5 6
missing:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin missing:~$ which echo /bin/echo missing:~$ /bin/echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Kada pokrenemo
1
echo
1
echo
1
:
1
$PATH
1
which
1
$PATH
Kretanje kroz shell
Putanja u shell-u je ograničena lista direktorijuma; odvojena
1
/
1
\
1
/
1
C:\\
1
/
1
pwd
1
cd
1
.
1
..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
missing:~$ pwd /home/missing missing:~$ cd /home missing:/home$ pwd /home missing:/home$ cd .. missing:/$ pwd / missing:/$ cd ./home missing:/home$ pwd /home missing:/home$ cd missing missing:~$ pwd /home/missing missing:~$ ../../bin/echo hello hello
Primjećujete da nas naš shell prompt izvještava šta je naš trenutni direktorijum bio. Možete podesiti vaš prompt da vam pokazuje razne vrste korisnih informacija, koje ćemo preći u kasnijim lekcijama.
Uopšteno, kada pokrenemo program, on će raditi u trenutnom direktorijumu, osim ako mu ne kažemo drugačije. Na primer, obično će tamo pretražiti datoteke i kreirati nove datoteke ukoliko je to potrebno.
Da bi vidjeli postojeće fajlove u zadatom direktorijumu, koristimo komandu
1
ls
1 2 3 4 5 6 7 8 9 10 11 12
missing:~$ ls missing:~$ cd .. missing:/home$ ls missing missing:/home$ cd .. missing:/$ ls bin boot dev etc home ...
Osim ako je direktorijum zadat kao prvi argument,
1
ls
1
-
1
h
1
--help
1
/?
1
ls --help
1
-l use a long listing format
1 2
missing:~$ ls -l /home drwxr-xr-x 1 missing users 4096 Jun 15 2019 missing
Ovo nam daje dosta novih informacija o svakom fajlu ili trenutnom direktorijumu. Prvo,
1
d
1
missing
1
rwd
1
missing
1
users
1
-
1
w
1
missing
1
x
1
r
1
/bin
1
x
Još jedan pogodni program, koji bi u ovom trenutku bilo dobro da znate jeste
1
mv
1
cp
1
mkdir
Ukoliko budete imali potrebu za više informacija koje su vezane za argumente programa, inpute, outpute, ili kako program generalno funkcioniše, pokušajte sa
1
man
1
q
1
missing:~$ man ls
Povezivanje programa
U shell-u programi imaju dva glavna toka koji su povezani sa njima: ulazni i izlazni tok. Kada program pokuša da čita input, čita se iz ulaznog toka, a kada nešto štampa, štampa u svom izlaznom toku. Obično se i input i output programa nalaze u vašem terminalu. Odnosno, vaša tastatura je vaš input, a vaš monitor je vaš output. Ipak, i te tokove možemo povezati.
Najjednostavnija forma preusmjeravanja je
1
< file
1
> file
1 2 3 4 5 6 7 8
missing:~$ echo hello > hello.txt missing:~$ cat hello.txt hello missing:~$ cat < hello.txt hello missing:~$ cat < hello.txt > hello2.txt missing:~$ cat hello2.txt hello
Takođe možete da koristite
1
>>
1
pipes
1
|
1
chain
1 2 3 4
missing:~$ ls -l / | tail -n1 drwxr-xr-x 1 root root 4096 Jun 20 2019 var missing:~$ curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2 219
Ućićemo u mnogo više detalja o tome kako da se najbolje iskoristi pipes u lekciji o obradi podataka.
Svestran i moćan alat
Na većini UNIX-like sistema, jedan korisnik je poseban:
1
root
1
sudo
Da bi bili root, postoji jedna stvar koju bi trebalo da uradite, a to je da pišete u
1
sysfs
1
/sys.sysfs
Na primer, osvijetljenje vašeg laptop ekrana se otkriva kroz fajl koji se zove
1
brightness
1
/sys/class/backlight
Upisivajući vrijednost u tom fajlu, možemo promijeniti osvijetljenje ekrana. Vaš prvi instikt bi vam mogao reći da uradite nešto ovako:
1 2 3 4 5 6
$ sudo find -L /sys/class/backlight -maxdepth 2 -name '*brightness*' /sys/class/backlight/thinkpad_screen/brightness $ cd /sys/class/backlight/thinkpad_screen $ sudo echo 3 > brightness An error occurred while redirecting file 'brightness' open: Permission denied
Ova greška vas može iznenaditi. Nakon svega, pokrenuli smo komandu sa
1
sudo
1
|
1
>
1
<
1
|
1
$ echo 3 | sudo tee brightness
Kako je
1
tee
1
/sys
1
sys
1
$ echo 1 | sudo tee /sys/class/leds/input6::scrolllock/brightness
Sledeći koraci
U ovom trenutku, poznato vam je kao da radite sa shell-om da bi obavili osnovne zadatke. Trebalo bi da ste u mogućnosti da se krećete kroz fajlove za koje ste zainteresovani, i koristite osnovne funkscionalnosti većine programa. U sledećoj lekciji, govorićemo o tome kako da izvršite i automatizujete zadatke koji su komplikovaniji koristeći shell i mnoge druge pogodne command-line programe.
Vježbe
- Kreirajte novi direktorijum i nazovite ga u okviru
1
missing
.1
/temp
- Pogledajte o programu.
1
touch
program je vaš prijatelj.1
man
- Koristite da bi kreirali novi fajl pod nazivom
1
touch
u1
semestar
.1
missing
- Napišite sledeće u tom fajlu, jednu po jednu liniju:
1
#!/bin/sh
1
curl --head --silent https://missing.csail.mit.edu
Prva linija može biti malo nezgodna. Pomoćiće vam da znate da
1
#
1
!
1
(")
- Pokušajte da izvršite fajl, npr. napišite putanju skripti () u vaš shell i pritisnite enter. Shvatite zašto ne radi konsultujući output komande
1
./semestar
(nagovještaj: pogledajte dio sa dozvolama u fajlu).1
ls
- Izvršite komandu eksplicitno startujući interpreter, i pružanjem fajla
1
sh
kao prvog argumenta, npr.1
semestar
. Zašto ovo radi za razliku od načina1
sh semestar
?1
./semestar
- Pogledajte program (koristite
1
chmod
).1
man chmod
- Koristite da bi omogućili da izvršavanje komande
1
chmod
radije nego da kucate1
./semestar
. Kako shell zna da bi fajl trebao da bude interpretiran koristeći1
sh semestar
? Pogledajte stranicu shebang za više informacija.1
sh
- Koristite i
1
|
da bi napisali "poslednji podešen" datum output od strane1
>
u fajl sa nazivom1
semestra
u vašem home direktorijumu.1
last-modified.txt
- Napišite komandu koja čita nivo napajanja baterije laptopa ili temperaturu procesora vaše mašine iz . Napomena: Ukoliko ste korisnik macOS-, vaš OS nema sysf, tako da možete preskočiti ovu vježbu.
1
/sys