= Interpretorul bash = [[https://docs.google.com/presentation/d/1btwpQIcgu5F9Upw0EKD7ufhzgLycuacE3q07N-_f_6w/pub?start=false&loop=false&delayms=3000|Slide-uri de prezentare]] == Tutorial == === Completare automată === * Aflați toate comenzile care încep cu "who". ** Tastați "who". * Rulati comanda ''whoami'' tastând un număr minim de taste. ** Tastați "whoa". * Intrați în directorul rădăcină a sistemului de fișiere. Întorceți-vă, apoi, în directorul vostru home. ** Rulați ''cd /''. ** Rulați, apoi, fie ''cd'' (fără argumente), fie ''cd ~''. * Întorceți-vă iar în directorul rădăcină (directorul în care erați înainte) apoi iar în directorul vostru home. ** Rulați ''cd -'' și apoi ''pwd'' să verificați unde sunteți. ** Ruați încă o dată ''cd -'' și verificați că ați ajuns în directoul home. * Intrați în directorul //Documents// din directorul home, folosind un număr minim de caractere. ** Tastați "cd Do". ** Nu este suficient? Mai tastați un să vedeți opținile pe care le aveți. ** Mai adăugați o literă ('c') și tastați pentru a completa cu numele directorului. * Creți în directorul curent (~/Documents) o ierarhie de directoare ''~/Documents/These/are/not/the/droids/you/are/looking/for/''. ** Rulăti comanda ''mkdir These/are/not/the/droids/you/are/looking/for/''. ** Nu merge? De ce? Căutați în pagina de manual al lui mkdir (''mkdir'') informații despre parametrul **-p**. ** Rulați comanda ''mkdir -p These/are/not/the/droids/you/are/looking/for/''. * Intrați în cel mai adânc director din ierarhia nou creată (directorul 'for'). ** Fiți eficienți! ** Sper că nu ați pus mâna pe mouse să dați copy/paste la cale. ** Tastați "cd ~/Documents/T" * Reveniți în directorul precedent. ** Hint: -. * Creați ierarhia de directoare //~/Documents/May/the/Force/by/with/you///. ** Aduceți-vă aminte de parametrul -p. * Intrați în cel mai adânc director din ierarhie fără să scrieți, efectiv, calea. ** Folosiți-vă de ultimul argument al comenzii precedente, care a fost fix calea. ** Tastați "cd ". * Reveniți în directorul vostru home. * Intrați iar în directorul //~/Documents/These/are/not/the/droids/you/are/looking/for///. ** Vă aduceți aminte că ați mai făcut asta odată? Refolosiți comanda precedentă! ** Tastați Ctrl-r și apoi un cuvânt cheie cum ar fi "droids". * Vizualizați ce comenzi ați dat până acum. ** Rulați comanda ''history''. * Sțergeți directoarele noi create. ** Aduceți-vă aminte laboratoarele trecute. === Scurtături la tastatură === **Este posibil să fie nevoie de următoarea modificare în terminal pentru ca exercițiile să meargă**: * Din meniul gnome-terminal accesați Edit -> Keyboard shortcuts. * Dezactivați cele două opțiuni din ferastra nouă. * Tastați în prompt mesajul "Ana are mere". * Oups... am greșit comanda. Voiam să fie afișat acel mesaj. ** Rulați 'echo !!'. ** Ce făcea "!!" ? * Folosiți reverse search (Ctrl-r) pentru a rescrie la prompt comanda ''echo Ana are mere'', dar fără a o rula. ** Verificați că promptul conține "echo Ana are mere". * Transformați mesajul în "Maria are pere". ** Mergeți la începutul comenzi cu **Ctrl-a**. ** Deplasați-vă un cuvânt înainte cu **Alt-f** și încă un caracter înainte cu **Ctrl-f**. ** Sțergeți cuvântul "Ana" cu **Alt-d** și înlocuiți-l cu "Maria" ** Mai deplasați-vă un cuvânt înainte cu **Alt-f** și încă un caracter înainte cu **Ctrl-f** (ar trebui să fiți la începutul cuvântului "mere"). ** Ștergeti primul caracter cu **Ctrl-d** și înlocuiți-l cu caracterul 'p'. ** Ruați comanda rezultată. === Comenzi interne === * Încercați să găsiți executabilul pentru comanda ''alias''. ** Hint: ''which''. ** De ce nu găsiți nimic? * Folosiți comanda (internă) ''help'' pentru afla informații despre comanda (internă) ''alias''. * Creați un alias în bash, astfel încât când rulați comanda ''ll'', să ruleze ''ls -l''. ** Rulați ''alias ll="ls -l"''. ** Verificați cu ''type ll'' că aliasul a fost creat și rulați ''ll'' pentru a vedea efectul. * Deschideți un nou terminal și încercați să rulați 'll'. ** Merge? ** Rulați comanda ''alias'' pentru a lista alias-urile setate în shell-ul curent. === Operatori === Un proces se poate termina cu succes (status 0) sau cu eroare (status diferit de 0). Statusul ultimului proces se poate vedea cu ajutorul comenzii: echo $? **true** și **false** sunt două programe care întotdeauna se termină cu succes, respectiv cu eroare. true echo $? 0 false echo $? 1 Folosind operatorii **&&** și **||**, putem rula un al doilea proces doar dacă primul proces a avut succes, respectiv eroare. Testați următoarele comenzi și observați dacă se execută sau nu procesul echo: true && echo "Success" false && echo "Success" true || echo "Fail" false || echo "Fail" === Variabile === * Setați două variabile, **a** și **b** la "Alice" și "Bob". a=Alice b=Bob * Afișați mesajul "Alice and Bob", folosind variabilele. ** Expandarea unei variabile se face cu ajutorul operatorului **$**. echo "$a and $b" Aveți grijă la ghilimele! alexj@hathor ~ $ echo "$a and $b" alice and bob alexj@hathor ~ $ echo '$a and $b' $a and $b alexj@hathor ~ $ echo `$a and $b` The program 'alice' is currently not installed. You can install it by typing: sudo apt-get install alice === Variabile de mediu === * Intrați în directorul /////. * Printați valoarea variabilei **OLDPWD**. ** Hint: echo, $. * Rulați comanda cd -. ** Ce face variabila ODLPWD? * Modificați variabila OLDPWD în /tmp și rulati comanda cd -. ** Observați efectul modificării variabilei de mediu. === Expandare aritmetică == * Rulați comenzile de mai jos și observați output-ul. ** Nu dați doar copy paste, ci scrieți comenzile pentru a observa ce se întâmplă. A=42 B=28 echo "A=$A and B=$B" echo "A+B=$(($A+$B))" A=$(($A+1)) B=$(($B*10)) echo "A=$A and B=$B" === Expandarea comenzilor === * Salvați în variabila OUTPUT ieșirea de la rularea comenzii ''ls''. ** Rulați ''OUTPUT=$(ls)''. * Vizualizați conținutul variabilei OUTPUT. ** Hint: echo, $. * Aflați dimensiunea executabilului comenzii ''ls''. ** Salvați într-o variabilă output-ul comenzii ''which ls''. ** Rulați ''ls -lh'' asupra variabilei respective. OUTPUT=$(which ls) ls -lah $OUTPUT == Recapitulare == # Afișați fișierele din directorul ''/bin'' sortat în ordinea dimensiunii fișierelor. Folosiți-vă de comanda ''stat'' și de opțiunea de formatare a acesteia (''-c'' sau ''%%--%%format''). # Afișați linie sub linie directoarele conținute de variabila de mediu ''PATH''. # Afișați fișierele din ierarhia ''/usr/include'' în ordinea numărului de apariții ale **cuvântului** ''FILE''. Folosiți ''grep'' cu opțiunile aferente și apoi ''sort''. **Indicație**: Căutați în pagina de manual a lui ''grep'' după, respectiv, ''recursive'', ''count'' și ''word''. # Afișați interfețele și adresele IP ale sistemului în formatul ''eth0,141.85.37.225'', linie sub linie. **Soluție și exemplu de rulare**: razvan@einherjar:~$ /sbin/ifconfig | awk -F '[ :]+' '/Link encap/ {printf "%s,", $1;} /inet addr/ {printf "%s\n", $4;}' docker0,172.17.42.1 eth0,172.16.14.167 lo,127.0.0.1 vboxnet0,virbr0,192.168.122.1 === Afișare caractere speciale === Inițializați variabila ''text'' la un șir de caractere. Afișați la ieșirea standard mesajul //"Variabila text are valoarea '"...'". Valorea poate fi actualizata."//. În mesaj, toate caracterele ghilimele (''"'') și apostrof (''%%'%%'') se vor afișa întocmai. === Afișare fișiere localizate === Folosiți comanda ''locate'' pentru a afișa fișierele din sistem care au extensia ''.conf''. Pentru fișierele de mai sus afișați directoarele din care fac parte. Eliminați duplicatele. Folosiți comanda ''dirname'' pentru extragerea directoarelor. Pentru directoarele de mai sus afișați numele directorului și inode-ul, separate prin virgulă ('',''). Folosiți comanda ''stat''. Sortați directoarele de mai sus în ordinea inode-ului. Afișați numele directorului și inode-ul (separate prin virgulă ('','')). === Afișare fișiere executabile pentru procese === Afișați procesele al căror proces părinte este ''init'', procesul cu PID-ul ''1''. Pentru procesele de mai sus afișați **doar** comanda completă. Filtrați doar acele comenzi care încep cu ''/'' (adică este calea completă către executabil). Selectați **doar** calea către executabil, fără argumente către acesta. Pentru executabilele de mai sus afișați numele și timpul ultimei schimbării (//change time//), separate prin virgulă ('',''). Folosiți comanda ''stat''. Sortați executabilele de mai sus în ordinea timpului ultimei schimbări. Sortarea poate fi simplă, nu este nevoie de sortare numerică. Formatul datei afișat de ''stat'' permite sortare de orice fel. === Creare fișiere === Creați 100 de fișiere cu numele "myfile-XY.txt", unde ''XY'' este indexul fișierului între ''00'' și ''99''. Folosiți comenzile ''seq'' și ''touch''. Ca model folosiți-vă de comanda seq -f "%02g" 1 100