Differences

This shows you the differences between two versions of the page.

Link to this comparison view

uso:cursuri:curs-07 [2022/10/03 21:18]
sergiu.weisz
uso:cursuri:curs-07 [2022/11/14 16:32] (current)
sergiu.weisz
Line 1: Line 1:
-====== Curs 07 - Automatizarea sarcinilor. Shell scripting ​=======+====== Curs 07 - Dezvoltarea programelor ​=======
  
-  * [[https://drive.google.com/​file/d/1DZFffcQgQQYSnXDCKl323BX8wAJ2VwGa/view?​usp=sharing| Slide-uri curs]] +  * [[https://docs.google.com/​presentation/d/1rdKx7y4UmVp0Bo09ETdKRjHvQUseiGPS/edit?​usp=sharing&​ouid=108131427433094834232&​rtpof=true&​sd=true ​| Slide-uri curs]] 
-  * [[https://​drive.google.com/​file/​d/​1RWD_GaQdysp0fx4qk780UwUK9OZHE-Px/​view?​usp=sharing| Handout 3on1 and notes space]] +  * **Cuvinte cheie**cod sursă, cod mașină, editor, IDE, pachet Software, fișier executabil, fișier obiect, compilare, linking, interpretoare,​ limbajul C, gcc, modularizare,​ sisteme de build, make, Makefile, git
-  ​[[https://​drive.google.com/​file/​d/​1PIaBMujm2lMVJrmT5m6XbTs_-AQwmVH9/​view?​usp=sharing | Handout 6on1]]+
   * **Suport de curs**   * **Suport de curs**
-    ​* [[https://​github.com/​systems-cs-pub-ro/​carte-uso/​releases | Utilizarea sistemelor de operare]] +      ​* [[https://​github.com/​systems-cs-pub-ro/​carte-uso/​releases | Utilizarea sistemelor de operare]] 
-        * Secțiunea ​13 Automatizarea sarcinilor+        * Secțiunea ​Dezvoltarea programelor
  
 +<​HTML>​
 +  <​center>​
 +    <iframe src="​https://​docs.google.com/​presentation/​d/​e/​2PACX-1vRSFTAlv99pNYR_sJui4w-v8wZmx7_7DKDM9R4mVuhy1r4xfRXQ07xtyXKF7VVRDQ/​embed?​start=false&​loop=false&​delayms=3000"​ frameborder="​0"​ width="​480"​ height="​389"​ allowfullscreen="​true"​ mozallowfullscreen="​true"​ webkitallowfullscreen="​true"></​iframe>​
 +  </​center>​
 +</​HTML>​
  
-===== Demo =====+====== Demo =======
  
-Ce este un script?+==== Comanda dpkg ==== 
 +  * Utilitarul dpkg este un manager de pachete pentru sisteme bazate pe Debian (ex. Ubuntu), care poate realiza mai multe acțiuni. 
 +  * Pentru simpla instalare a unui pachet, folosim opțiunea -i, alături de numele fișierului „.deb”, descărcat anterior (sau calea către acest fișier, dacă ne aflăm într-un folder diferit):
  
-Un script shell este un program scris într-un fișier text format din combinații de 
-comenzi și instrucțiuni specifice unui interepretor de comenzi (unui shell). 
-Shell-ul este un interpretor de comenzi care faciliteaza accesul utilizatorului la resursele sistemului de operare. 
- 
-Cum arată un script shell: 
 <​code>​ <​code>​
-#!/bin/bash +student@uso:​~$ sudo dpkg -i google-chrome-stable_current_amd64.deb  
-echo Noi suntem banul si stema+Selecting previously unselected package google-chrome-stable. 
 +(Reading database ... 196951 files and directories currently installed.) 
 +Preparing to unpack google-chrome-stable_current_amd64.deb ... 
 +Unpacking google-chrome-stable (86.0.4240.111-1) ... 
 +Setting up google-chrome-stable (86.0.4240.111-1) ... 
 +update-alternatives:​ using /usr/bin/google-chrome-stable to provide /​usr/​bin/​x-www-browser (x-www-browser) in auto mode 
 +update-alternatives:​ using /​usr/​bin/​google-chrome-stable to provide /​usr/​bin/​gnome-www-browser (gnome-www-browser) in auto mode 
 +update-alternatives:​ using /​usr/​bin/​google-chrome-stable to provide /​usr/​bin/​google-chrome (google-chrome) in auto mode 
 +Processing triggers for gnome-menus (3.13.3-11ubuntu1.1) ... 
 +Processing triggers for desktop-file-utils (0.23-1ubuntu3.18.04.1) ... 
 +Processing triggers for mime-support (3.60ubuntu1) ... 
 +Processing triggers for man-db (2.8.3-2) ...
 </​code>​ </​code>​
  
-  * Ce înseamnă ''#​!/​bin/​bash?''​ +<​note> ​ În cazul în care pe sistemul nostru ​este deja instalată o versiune mai veche a pachetului, dpkg creează un back up al vechilor fișiere, astfel încât să poată păstra versiunea inițială dacă apar probleme la noua instalare</​note>​
-Secvența de caractere (''​shebang''​) ​care este prezentă tot timpul la începutul unui script ​și care indică interpretorul scriptului (în exemplul dat fiind shell-ul Bash).+
  
-  * Cum creăm ​și rulăm ​un script? +  * Pentru a șterge un pachet instalatfolosim opțiunea -r: 
-Putem deschide command line-ul, creăm un fișier cu extensia ''​.sh''​ (good practice), pe care ulterior îl edităm folosind orice editor text (vim, Sublime etc.)căruia ulterior trebuie sa îi dăm drepturi de execuție (chmod pentru a schimba și ls -l pentru verificare). La sfârșit, putem rula script-ul ca pe orice executabil. + 
-<​code>​ +<​code>​  
-student@uso:​~/​Documents$ vi script.sh +sudo dpkg -r google-chrome-stable ​ 
-student@uso:​~/​Documents$ chmod +x script.sh +(Reading database ​... 197063 files and directories currently installed.) 
-student@uso:​~/​Documents$ ls -l script.sh +Removing google-chrome-stable (86.0.4240.111-1...
--rwxr-xr-student student 44 nov  3 17:06 script.sh   +
-student@uso:​~/​Documents$ ​./script.sh +
-Noi suntem banul si stema+
 </​code>​ </​code>​
  
-  * De ce shell scripting?​ +În cazul ștergerii, trebuie să folosim ca parametru al comenzii numele pachetului instalatnu numele ​fișierului „.deb” folosit ​pentru ​instalare.
-Script-urile oferă posibilitatea de automatizare a sarcinilor putând utiliza o serie mai mare de comenzi laolaltă. De asemeneastructurile repetitive (for, while) și cele decizionale (if, else) pot fi implementate ușor folosind shell scriptingOperatorii logici sunt și ei des folosiți pentru a înlănțui mai multe comenzi, la fel ca și pipe-urile (“|) - folosite ​pentru ​a folosi output-ul unei comenzi în comanda următoare. +
  
-Mai jos este un demo cu comenzile cele mai folosite pentru shell scripting ​și pentru a automatiza lucrul în linia de comandă.+  * Anumite fișiere de configurare ar putea rămâne în sistem după simpla ștergere cu -r, deoarece au fost create separat de scripturi de configurareDacă vrem să fim siguri că și acestea sunt șterse, putem folosi opțiunea dpkg -P (purge)
  
-==== Comanda grep ==== 
-Comanda grep extrage liniile care conțin o expresie regulata dată dintr-un fișier. 
 <​code>​ <​code>​
-student@uso:​~/Documentscat cap_si_pajura | grep frate +student@uso:​~$ ​sudo dpkg -P google-chrome-stable ​ 
-Am fost frate pentru fratex2 +(Reading database ​... 197063 files and directories currently installed.) 
-Ca nu e si fratele tau +Removing google-chrome-stable (86.0.4240.111-1) ... 
-Am fost frate pentru fratex2 +... 
-Am fost frate pentru fratex2+Purging configuration files for google-chrome-stable (86.0.4240.111-1) ...
 </​code>​ </​code>​
  
-==== Comenzile head și tail ==== +  * Tot dpkg ne oferă posibilitatea de a lista toate pachetele din sistem, alături de versiune, tipul arhitecturii ​și o scurtă descriere, cu opțiunea ​-l:
-Comenzile head si tail sunt folosite pentru afișarea primelor/​ultimelor linii sau caractere dintr-un input+
  
 <​code>​ <​code>​
-student@uso:​~/Documentscat cap_si_pajura | grep frate | head -2 +student@uso:​~$ ​dpkg -l 
-Am fost frate pentru frate. x2 +Name                                       ​Version ​                                        ​Architecture Description 
-Ca nu e si fratele tau ++++-==========================================-===============================================-============-=============================================================================== 
-student@uso:​~/​Documents$ cat himalaya | grep bani | tail -3 +ii  accountsservice ​                           0.6.45-1ubuntu1 ​                                ​amd64 ​       query and manipulate user account information 
-Tot aşa găsesc eu banii şi în vârful munţilor+ii  acl                                        2.2.52-3build1 ​                                 amd64        Access control list utilities 
-Eu fac bani şi-n Himalaya +ii  acpi-support ​                              ​0.142 ​                                          ​amd64 ​       scripts for handling many ACPI events 
-Unde fac eu bani pachete, duşmanii culeg doar pietre…+ii  acpid                                      1:​2.0.28-1ubuntu1 ​                              ​amd64 ​       Advanced Configuration and Power Interface event daemon 
 +ii  adduser ​                                   3.116ubuntu1 ​                                   all          add and remove users and groups 
 +...........
 </​code>​ </​code>​
  
  
-==== Comanda seq ==== +* Dacă ne interesează să verificăm dacă un anumit pachet ​este deja instalat, putem folosi opțiunea -s, care ne va afișa statusul pachetului (installed / uninstalled) și o serie mai largă de informații legate de acesta: 
-Comanda seq este folosită pentru a genera o secvență de numere. +
-Flagul -s este folosit pentru a stabili caracterul ​care delimitează numerele. Delimitatorul implicit este ‘\n’.+
 <​code>​ <​code>​
-student@uso:​~$ ​seq 4 +student@uso:​~$ ​dpkg -s zsh 
-1 +Package: zsh 
-2 +Status: install ok installed 
-3 +Priority: optional 
-4 +Section: shells 
-student@uso:~$ seq -s " " 1 2 5 +Installed-Size2070 
-1 3 5+Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com 
 +.......
 </​code>​ </​code>​
  
-În comanda de mai sus 1 reprezintă numarul de la care pornim numărătoarea2 este incrementul,​ iar 5 este numărul la care ne oprim+ 
-Opțiunea -f este folosită pentru ​afișa secvența într-un anumit format.+==== gcc (compilarea programelor) ==== 
 + 
 +  * GNU Compiler Collection este un compilator pentru C/C++, adică un program ce traduce codul nostru sursă în cod mașină, păstrat într-un fișier executabil și care va putea fi rulat pe procesor
 +  * Pentru ​compila un fișier de tip cod sursă, putem folosi comanda gcc însoțită de numele sursei: 
 <​code>​ <​code>​
-student@uso:​~$ ​seq -f "Star Wars Episode %01g" 3 +student@uso:​~/demosgcc hello_world.c ​ 
-Star Wars Episode 1 +student@uso:​~/​demos$ ls 
-Star Wars Episode 2 +a.out  hello_world.c 
-Star Wars Episode 3 +student@uso:​~/demosfile a.out 
-student@uso:​~$+a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=ddbe5634d0b0da5b4eab5d27d6b77236d7a90f7b,​ not stripped
 </​code>​ </​code>​
  
-==== Comanda cut ==== +Observăm că după rularea comenzii este creat fișierul a.out de tip „ELF 64-bit shared object”adică un fișier ​executabil ce va putea fi rulat. 
-Comanda cut este folosită pentru a tăia aceeași secțiune din fiecare linie unui input și a afișa aceste părți ale liniilor. + 
-De exemplupentru următorul fișier ​vrem să afișăm doar numele filmelornu și anul în care a avut loc premiera fiecăruia.+  * Dacă dorim ca executabilul rezultat în urma compilării ​să aibă un anumit numefolosim opțiunea -o: 
 <​code>​ <​code>​
-student@uso:​~$ ​cat asok.txt +student@uso:​~/demosgcc hello_world.c -o hello 
-Inception 2010 +student@uso:​~/demosls 
-Parasite 2019 +hello  hello_world.c
-Se7en 1995 +
-Goodfellas 1990 +
-Gladiator 2000 +
-Alien 1979 +
-student@uso:​~$ ​cut -d " " -f 1 asok.txt +
-Inception +
-Parasite +
-Se7en +
-Goodfellas +
-Gladiator +
-Alien +
-student@uso:​~$+
 </​code>​ </​code>​
  
-Opțiunea ''​-f''​ se folosește pentru ​selecta ce coloane din input vrem să fie afișate, iar opțiunea ​''​-d''​ definește delimitatorul dintre coloane.+  * Prin utilizarea a diferitelor opțiuni, putem opri procesul de compilare după fiecare pas descris în curs și obținem astfel fișierul obținut la fiecare etapă ​compilării. 
 +Cu opțiunea -E, rezultatul este codul rezultat după etapa de preprocesare. Acest cod este afișat la ieșirea standard, însă poate fi redirectat într-un fișier cu extensia „.i” (această extensie indică faptul că fișierul nu mai trebuie să treacă prin preprocesare).
  
-==== Comanda sed ==== +<​code>​  
-Comanda sed se poate folosi cu mai multe scopuri, sed fiind un stream editor avansat. Se folosește în principal pentru inserții sau șteregere de caractere într-un input. +student@uso:​~/demosgcc -E hello_world.c > hello_world.i 
-<​code>​ +student@uso:​~/demosfile hello_world.i 
-student@uso:​~$ ​cat text.txt +hello_world.i: C sourceASCII text
-Noi ştim că unu ori unu fac unu, +
-dar un inorog ori o pară +
-nu ştim cât face. +
-Ştim că cinci fără patru fac unu, +
-dar un nor fără o corabie +
-nu ştim cât face+
-student@uso:​~$ ​sed '​s/​unu/​bani/'​ text.txt +
-Noi ştim că bani ori unu fac unu, +
-dar un inorog ori o pară +
-nu ştim cât face. +
-Ştim că cinci fără patru fac bani, +
-dar un nor fără o corabie +
-nu ştim cât face. +
-student@uso:​~$+
 </​code>​ </​code>​
  
-În exemplul ​de mai susprima apariție de pe fiecare linie a cuvântului “unu” ​este înlocuită ​cu “bani”Caracterul ​care vine imediat după sed indică operația care se face pe input (substitution).+Pentru a obține fișierul în limbaj ​de asamblare rezultat în urma compilăriifolosim opțiunea -S (în aces caz, codul în limbaj ​de asamblare ​este salvat direct într-un fișier ​cu extensia „.s):
  
-Mai jos sunt schimbate toate aparițiile cuvântului “unu”. ​ 
 <​code>​ <​code>​
-student@uso:​~$ ​sed '​s/​unu/​bani/​g'​ text.txt +student@uso:​~/demosgcc -S hello_world.c 
-Noi ştim că bani ori bani fac bani, +student@uso:​~/demosfile hello_world.s  
-dar un inorog ori o pară +hello_world.s:​ assembler source, ASCII text
-nu ştim cât face. +
-Ştim că cinci fără patru fac bani, +
-dar un nor fără o corabie +
-nu ştim cât face. +
-student@uso:​~$+
 </​code>​ </​code>​
  
-Comanda se poate folosi și pentru ​șterge linii din input.+După ce codul fost tradus ​din limbaj de asamblare în cod mașină, putem opri procesul înaintea etapei de link-editare,​ folosind opțiunea „-c”. Rezultatul va fi un fișier cu extensia „.o” ce conține cod mașină, fără a fi linkat încă cu bibliotecile necesare.
  
 <​code>​ <​code>​
-student@uso:​~$ ​sed '​3d'​ text.txt +student@uso:​~/demosgcc -c hello_world.c 
-Noi ştim că unu ori unu fac unu, +student@uso:​~/​demos$ file hello_world.
-dar un inorog ori pară +hello_world.o: ELF 64-bit LSB relocatable,​ x86-64, version 1 (SYSV), not stripped
-Ştim că cinci fără patru fac unu, +
-dar un nor fără o corabie +
-nu ştim cât face.+
 </​code>​ </​code>​
  
-Comanda de mai sus șterge treia linie. +  * În general, programele pe care le dezvoltăm sunt prea complexe pentru a fi scrise într-un singur fișier, motiv pentru care ne dorim să realizăm compilarea din mai multe surse. Pentru a ilustra modul de lucru, vom crea un program care să realizeze operațiile de adunare ​și scădere ​2 numere întregiVom folosi fișierul sursă „operations.c” pentru ​implementa cele 2 funcții și fișierul „main.c” pentru a apela aceste funcții. 
-Mai jos se șterge linia care conține secvențde caractere “cinci”.+
  
 <​code>​ <​code>​
-student@uso:​~$ sed '/​cinci/​d'​ text.txt +operations.c 
-Noi ştim că unu ori unu fac unu+int addition(int aint b) { 
-dar un inorog ori o pară +       return a + b; 
-nu ştim cât face. +} 
-dar un nor fără o corabie +int substraction(int a, int b) { 
-nu ştim cât face.+      ​return a - b; 
 +}
 </​code>​ </​code>​
  
-Folosind regex-uriputem face pattern matching destul de ușor folosind această comandă. +Pentru a putea apela funcțiile din „operations.c” în „main.c”va trebui să creăm un fișier de tip header, în acest caz „operations.h”pe care -l includem ​la începutul ​fișierului main și care să conțină doar antetele funcțiilor respective.
-De exemplucomanda de mai jos șterge linia care conține string-ul “nu” ​la începutul ​unui șir +
  
 <​code>​ <​code>​
-student@uso:​~$ sed '/​^nu/​d'​ text.txt +Operations.h 
-Noi ştim că unu ori unu fac unu+int addition(int aint b); 
-dar un inorog ori o pară +int substraction(int a, int b); 
-Ştim că cinci fără patru fac unu+Main.c 
-dar un nor fără o corabie +#include <​stdio.h>​ 
-student@uso:~$+#include "​operations.h"​ 
 +int main() { 
 +     int a = 3b = 2; 
 +     printf("​Suma este: %d\n", addition(a, b)); 
 +     printf("​Diferenta este%d\n", substraction(a,​ b)); 
 +     ​return 0; 
 +}
 </​code>​ </​code>​
  
-==== Comanda wc ==== +<​note>​Dacă am include „operations.c” ar apărea o eroare la compilaredin cauza faptului că ar apărea câte 2 definiții ale funcțiilor,​ atât în „operations.c”,​ cât și în „main.c”. Folosind ​un header, în „main.c” vom include doar antetele, compilatorul știind astfel că aceste funcții există, urmând să găsească definițiile lor în alt fișier. 
-Comanda wc este folosită pentru a număra liniilecuvintele sau carcterele dintr-un input.+</​note>​
  
 +<​note>​ La includerea antetelor definite de noi, numele antetului se pune între „”, nu între <>, ca în cazul „stdio.h”. gcc ne va permite să compilăm ambele surse și să obținem un singur executabil final.</​note>​
 <​code>​ <​code>​
-student@uso:​~$ ​cat yossa +student@uso:​~/demosgcc -o operations operations.c main.c 
-Can you live without answers? All of you, ask that of yourselfCan you live without answers? +student@uso:​~/demos./​operations ​ 
-Because if you cannot, then most assuredly you will invent your own answers and they will comfort +Suma este: 5 
-you. And all those who do not share your view will by their very existence strike fear and hatred +Diferenta este: 1
-into your heart+
-student@uso:​~$ ​wc yossa +
-  ​4 ​ 56 307 yossa+
 </​code>​ </​code>​
  
-4 este numărul de linii, 56 este numărul de cuvinte, iar 307 este numărul de caractere.+==== Make ====
  
-==== forwhileifelse ====+  * Atunci când lucrăm la aplicații complexecare implică un număr mare de fișiere sursăheadere etc.procesul de build devine greoi dacă este făcut „manual” (de ex. prin comanda gcc la fiecare re-compilare a codului sursă, când apar modificări). Pentru a automatiza acest proces, putem folosi utilitarul make. 
 +  * Comanda make caută în directorul curent fișiere numite Makefile. Un fișier Makefile conține una sau mai multe reguli, adică nume atribuite unor comenzi. Comanda make fără argumente execută prima regulă din Makefile, iar dacă dorim să rulăm o anumită regulă, folosim „make <nume regulă>​”. 
 +  * Pentru programul cu operațiile aritmetice, putem scrie următorul Makefile, conținând regula build care se va ocupa de compilare:
  
-Înainte de a prezenta aceste instrucțiuni,​ trebuie să înțelegem ce presupune folosirea caracterului ''​$''​ in niște situații. 
- 
-''​$(command)''​ - se înlocuiește cu output-ul comenzii “command” 
 <​code>​ <​code>​
-student@uso:~$ echo Output-ul este $(echo acesta) +Makefile 
-Output-ul este acesta +build 
-student@uso:​~$+ gcc -o operations operations.c main.c
 </​code>​ </​code>​
-''​$(var)''​ - valoarea ce se găsește în variabila var 
 <​code>​ <​code>​
-student@uso:​~$ ​a=5 +student@uso:​~/demosmake 
-student@uso:​~$ ​echo $a +gcc -o operations operations.c main.c 
-+student@uso:​~/demos./​operations ​ 
-student@uso:~$+Suma este: 
 +Diferenta este1
 </​code>​ </​code>​
  
-==== Instructiunea if ==== +  * Tot în Makefile putem defini mai multe reguli, între care putem stabili anumite dependențe. Pe scurt, rularea unei reguli va depinde de existența unuia sau mai multor fișiere. Dacă fișierele respective există în directorul curent, regula ​este rulată, dacă nu, se caută în Makefile o altă regulă cu numele respectivului fișier și se rulează mai întâi aceasta (sau se continuă lanțul dependețelor).
-Sintaxa lui if este următoarea:+
  
 <​code>​ <​code>​
-if [ conditie ] +Makefile 
-then +build : operations.o 
-   comenzi + gcc -o operations operations.o main.c 
-fi +operations.o:​ 
-</​code>​ + gcc -c operations.c 
-Pe lângă aceasta mai putem avea și if-else sau if-elif-else-fi spre exemplu +clean: 
-<​code>​ + rm operations
-if [ conditie ] +
-then +
-   ​comenzi pentru conditie true +
-else +
-   comenzi pentru conditie false +
-fi+
 </​code>​ </​code>​
 +
 <​code>​ <​code>​
-if [ conditie1 ] +student@uso:​~/​demos$ make 
-then +gcc -c operations.c 
-   comenzi pentru conditie1 true +gcc -o operations operations.o main.c 
-elif [ conditie2 ] +student@uso:​~/​demos$ ./​operations ​ 
-then +Suma este: 5 
-   comenzi pentru conditie2 true +Diferenta este: 1 
-else +student@uso:​~/​demos$ make clean 
-   comenzi pentru conditie2 false +rm operations 
-fi+student@uso:​~/​demos$ ls 
 +Makefile ​ main.c ​ operations.c ​ operations.h ​ operations.o
 </​code>​ </​code>​
-Mai jos este un exemplu de folosire a unui if într-un script. Sintaxele diferite de mai sus funcționează la fel ca cele pe care le știm de la programare. În schimb, condițiile sunt cele care necesită un plus de atenție. 
  
-<​code>​ +Mai sus, regula build depinde de un fișier de tip obiect numit „operations.o”. Deoarece acesta nu există încă în director, se rulează regula cu numele lui, care generează fișierul prin compilarea sursei „operations.c”,​ iar apoi se revine la regula build. De asemenea, am adăugat regula clean, folosită pentru a șterge executabilul când am încheiat o sesiune de testare. ​
-#!/bin/bash+
  
-a=6 
-b=7 
-if [[ $a -eq $b ]] 
-then 
- echo "​Numerele sunt egale" 
-elif [[ $a -gt $b ]];  
-then 
- echo "a mai mare decat b" 
-else 
- echo "b mai mare decat a" 
-fi 
  
-student@uso:​~$ ./​script.sh +==== Git ====
-b mai mare decat a +
-student@uso:​~$ +
-</​code>​+
  
-Instrucțiunile for și while pot fi folosite atât în cadrul terminalului în comenzicât și în script-uri. +  * Aproape toate aplicațiile complexe sunt dezvoltate ​în echipefapt care poate face organizarea ​și structurarea proiectului destul de complicată. Ne vom dori adesea ca anumite feature-uri să fie dezvoltate și testate separat și doar apoi integrate în proiectul finalDe asemenea, apar situații când ne dorim să ne putem întoarce la un stadiu anterior al proiectului. Git este un sistem de versionare a codului ce rezolvă astfel de probleme, iar în continuare vom prezenta câteva comenzi de bază. 
-Mai jos este un exemplu cu loop-ul for folosit ​într-o comandă+  * Un proiect este păstrat ​într-un repository (repo), în cazul lucrului în echipă fiind vorba despre un repository remote. Pentru a crea clonă locală a unui repo, folosim comanda git clone, însoțită de numele repository-ului. Această ​comandă ​creează pe sistemul local un folder cu numele repository-ului,​ care va conține atât fișierele propriu zise, cât și fișierele utilizate de git în realizarea versionării.
  
 <​code>​ <​code>​
-student@uso:​~$ ​for v in $(seq 1 4); do echo linia $v; done +student@uso:​~/demosgit clone https://​github.com/​systems-cs-pub-ro/​uso 
-linia 1 +Cloning into '​uso'​... 
-linia 2 +remote: Enumerating objects: 150, done. 
-linia 3 +remote: Counting objects: 100% (150/150)done. 
-linia 4+remote: Compressing objects: 100% (115/115), done. 
 +remote: Total 2198 (delta 31), reused 138 (delta 19), pack-reused 2048 
 +Receiving objects: 100% (2198/​2198),​ 118.28 MiB | 5.20 MiB/s, done. 
 +Resolving deltas: 100% (1016/​1016),​ done. 
 +student@uso:​~/​demos$ cd uso 
 +student@uso:​~/​demos/​uso$ ls -a 
 + .    .git       '​TW Warhammer' ​  ​lab03 ​  ​lab05 ​  ​lab10 ​  ​tema1 ​  tema3 
 + ..   ​README.md ​  ​lab02 ​          ​lab04 ​  ​lab09 ​  ​lab12 ​  ​tema2 ​  tema4
 </​code>​ </​code>​
-For poate fi folosit si intr-un script. 
-<​code>​ 
-student@uso:​~$ cat script.sh 
-#!/bin/bash 
  
-a=0; +  * La creare, un repository are doar branch-ul master, care conține în general versiunea stabilă ​proiectuluiAtunci când vrem să ne aducem contribuția,​ ne creăm un branch distinct pornind de la master sau de la un alt branch deja existentAstfel, putem să facem orice modificare, fără a afecta branch-ul de la care am pornit. Comanda git checkout -b <nume branch> va crea un branch nou și ne va muta automat pe acesta (git status ​afișează ​numele branch-ului curent ​și situația modificărilor aduse). Imediat după creare, stadiul proiectului din noul branch va fi identic cu cel înregistrat în branch-ul de la care am pornit.
-for v in $(seq 1 4) +
-do +
- a=$(($a + $v)); +
-done +
-echo $a; +
-student@uso:​~$ ​./script.sh +
-10 +
-student@uso:​~$ +
-</​code>​ +
-Script-ul de mai sus afișează ​suma numerelor de la 1 la 4. +
-În același mod poate fi folosit și while: +
-<​code>​ +
-#!/bin/bash+
  
-i=0; +<​code>​ 
-while [ $-le 3 ] +student@uso:​~/​demos/​usogit checkout ​-b cool_feature 
-do +Switched to a new branch '​cool_feature'​ 
-   echo ​$i +student@uso:​~/​demos/​usogit status 
-    ​ i=$(($i+1)) +On branch cool_feature 
-done+nothing to commit, working tree clean
 </​code>​ </​code>​
  
-Script-ul afișează valorile de la 0 la 3+  * Conceptul de salvare al unui anumit stadiu al proiectului poate fi asociat cu crearea unui commit. 
 + 
 +După simpla adăugare a unui nou fișier (sau după modificarea unui fișier existent), git ne va semnala că statusul acestuia este untracked. Folosind comanda git add, adăugăm fișierul respectiv pe lista fișierelor ce conțin update-uri pe care vrem să le includem în următorul commit. 
 <​code>​ <​code>​
-student@uso:​~$ ./script.sh +student@uso:​~/demos/usoecho "​cool_feature"​ > cool_feature.txt 
-0 +student@uso:​~/demos/uso$ git status 
-1 +On branch cool_feature 
-2 +Untracked files: 
-3 +  (use "git add <​file>​..."​ to include in what will be committed) 
-student@uso:​~$+ cool_feature.txt 
 +nothing added to commit but untracked files present (use "git add" to track) 
 +student@uso:​~/demos/usogit add cool_feature.txt  
 +student@uso:​~/​demos/​uso$ git status 
 +On branch cool_feature 
 +Changes to be committed:​ 
 +  (use "git reset HEAD <​file>​..."​ to unstage) 
 + new file:   ​cool_feature.txt
 </​code>​ </​code>​
-Mai jos avem un script care pune la sfârșitul liniilor pare dintr-un text un string: 
-<​code>​ 
-#!/bin/bash 
  
-nr_linii=$(wc ​-l text.txt | cut -d " " ​-f 1+După ce am adăugat toate fișierele pe care dorim să le folosim, comanda git commit ​-m va salva un snapshot al fazei curente a proiectului nostru, alături de un mesaj sugestiv transmis ca argumentCommit-ul va fi înregistrat alături de metadatele sale (data și ora, branch-ul, mesajulîn istoricul repo-ului. Pentru a vizualiza ulterior acest istoric, putem folosi comanda git log. 
-i=0 + 
-while [ $-le $nr_linii ​+<​code>​ 
-do +student@uso:​~/​demos/​usogit commit ​-m "​Create cool feature"​ 
-    if [[ $(($i%2)) -eq 0 && $i -gt 0 ]] +[cool_feature 0bfd61eAdd cool feature 
-    ​ then + 1 file changed, 1 insertion(+
-   sed -i "$i s/$/ yeah/" text.txt + create mode 100644 cool_feature.txt 
-    ​ fi +student@uso:​~/demos/usogit log 
-    i=$(($i+1)+commit 0bfd61efa5778e62d090da43a1def9f96f5e1930 ​(HEAD -> cool_feature
-done+Author: Student USO VM User <​student@stud.acs.upb.ro>​ 
 +Date:   Sun Oct 25 15:46:53 2020 +0200 
 +    Add cool feature 
 +......
 </​code>​ </​code>​
-Se observă ​că acest script folosește atât un while, cât și un ifprecum și comanda sed.+ 
 +<​note>​Unul dintre motivele pentru care folosim mai întâi git add și apoi git commit este că uneori vom avea mai multe fișiere modificate ​și vom dori să le grupăm în commit-uri într-un mod relevant (1 commit – o funcționalitate adăugată/​un bug rezolvat)astfel încât să păstrăm un istoric relevant al proiectului.</​note>​ 
 + 
 +  * Atunci când considerăm că modificările pot fi integrate în versiunea finală a proiectului,​ realizăm operația de merge, prin care integrăm modificările aflate momentan doar pe branch-ul nostru în branch-ul master. 
 <​code>​ <​code>​
-student@uso:​~$ ​cat text.txt +student@uso:​~/demos/usogit checkout master ​ 
-California, rest in peace +Switched to branch '​master
-Simultaneous release +Your branch is up to date with 'origin/​master'​. 
-California, show your teeth +student@uso:​~/demos/usols 
-She's my priestess + ​README.md       ​lab02 ​  ​lab04 ​  ​lab09 ​  ​lab12 ​  ​tema2 ​  ​tema4 
-I'm your priest +'TW Warhammer' ​  ​lab03 ​  ​lab05 ​  ​lab10 ​  ​tema1 ​  tema3 
-student@uso:​~$ ./script.sh +student@uso:​~/demos/usogit merge master cool_feature  
-student@uso:​~$ ​cat text.txt +Updating 0b8c9aa..0bfd61e 
-California, rest in peace +Fast-forward 
-Simultaneous release yeah + cool_feature.txt | 1 + 
-Californiashow your teeth + 1 file changed1 insertion(+) 
-She's my priestess yeah + create mode 100644 cool_feature.txt 
-I'm your priest +student@uso:​~/demos/usols 
-student@uso:​~$+ ​README.md ​      ​cool_feature.txt ​  ​lab03 ​  ​lab05 ​  ​lab10 ​  ​tema1 ​  ​tema3 
 +'TW Warhammer' ​  ​lab02 ​             lab04   ​lab09 ​  ​lab12 ​  ​tema2 ​  tema4
 </​code>​ </​code>​
 +
 +  * În cazul în care lucrăm cu un repository remote, comanda git push rulată dintr-un branch al repository-ului local va crea în repository-ul „părinte” o copie a acestui branch, care va conține istoricul commit-urilor de pe branch-ul local. În acest caz, procesul de merge cu branch-ul master va fi probabil gestionat prin platforma online care găzduiește proiectul (ex. Github).
 +
 +Pentru a înțelege mai bine modul de lucru cu git, puteți parcurge următorul tutorial: https://​gitimmersion.com/​
uso/cursuri/curs-07.1664821100.txt.gz · Last modified: 2022/10/03 21:18 by sergiu.weisz
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0