Comandă | Descriere scurtă |
---|---|
cat | afișare conținut fișier |
seq | generare secvență de numere |
grep | extrage linii care conțin o anumită expresie regulată |
cut | extragere anumite coloane |
sed | filtru de text avansat, folosit pentru substituții |
wc | contorizare număr de linii, cuvinte sau caractere |
head | afișare a primelor linii sau caractere |
tail | afișare a ultimelor linii sau caractere |
for | parcurgere listă de elemente pentru aplicarea de comenzi pentru fiecare element în parte |
if | condiție de execuție a unor comenzi |
$(comm) | expandarea unei comenzi (command expansion) - înlocuirea cu output-ul comenzii |
comm1 | comm2 | legarea a două comenzi: output-ul primei comenzi devine input pentru cea de-a doua comandă |
$var sau ${var} | valoarea variabilei var |
${#var} | lungimea valorii variabilei var (în caractere) |
${var:2:3} | un subșir al valorii variabilei var : de la indexul 2 se extrag 3 caractere |
Pentru acest laborator vom folosi comenzi și noțiuni prezentate în laboratoarele de până acum în special laboratorul trecut (Laborator 07 - Automatizarea în linia de comandă). Vor fi puține comenzi nou introduse; cel mai mult ne va interesa cum, dându-se o situație practică, vom putea folosi shell-ul pentru automatizare.
Automatizarea sarcinilor se referă la delegarea / degrevarea acțiunilor utilizatorilor către programe în sistemul de calcul. Un program va face automat, de sine stătător, acțiuni pe care le-ar face utilizatorul, rezultând în timp mai puțin consumat de utilizator.
Acțiunile care sunt candidate pentru automatizare sunt în general acțiuni repetitive, nu foarte simple și neinteractive. Automatizarea acestora va elibera utilizator de la executarea repetată, plictisitoare, manuală a acestora.
Automatizarea sarcinilor urmărește eficiență, în special temporală. Cu cât face mai rapid acțiuni repetitive, cu atât este mai bine. Acțiunile repetitive necesită interacțiune minimă cu utilizatorul, pentru a eficientiza timpul
Când automatizăm, folosim scripting și funcționalități existente. Un principiu esențial al automatizării este don't repeat yourself (nu reinventăm roata). Dacă există comenzi sau funcționalități existente, le folosim pe acelea. Altfel spus, urmărim atât eficiența execuției cât și eficiența dezvoltării.
Eficiența execuției o putem realiza nu doar prin scripting, ci și prin acțiuni precum:
Atunci când folosim scripting în shell, ne folosim de funcționalități existente ale shell-ului, pe care le vom descrie mai jos.
Scripting presupune folosirea unui limbaj interpretat (numit limbaj de scripting). Acesta poate fi un limbaj precum Python, Perl sau Ruby sau poate fi chiar shell-ul CLI (interpretorul de comenzi). Limbajele de scripting au avantajul dezvoltării rapide: adăugăm și testăm rapid funcționalități noi.
Shell scripting are avantajul folosirii comenzilor existente în shell (comenzi de lucru cu fișiere, cu procese, comenzi de filtrare de text). Pentru acțiuni rapide (de tipul quick'n'dirty), shell scripting este o soluție foarte bună. Atunci când avem prelucrări numerice sau prelucrări de șiruri, shell scripting poate fi insuficient și este indicat să apelăm la un limbaj de scripting mai complet, precum Python, Ruby sau Perl.
Funcționalitățile shell-ului sunt folosite în eficiența rulării comenzilor și în automatizare. Le-am folosit și amintit pe parcursul ultimelor laboratoare, în special în laboratorul trecut. Astfel de funcționalități sunt:
>
, <
, >>
|
(pipe)Pe parcursul acestui laborator vom folosi funcțioalități ale shell-ului care sunt în special folosite în shell scripting:
if
, for
, while
Automatizarea prin shell scripting presupune, în mod uzual, o secvență de comenzi. Aceste comenzi sunt adăugate într-un script unde vor fi rulate la comun, fără a fi nevoie de rularea manuală a fiecărei comenzi.
Pentru a configura rulare unei secvențe de comenzi putem condiționa rularea scriptului folosind variabile sau argumente în linia de comandă. Acestea pot genera un comportament diferit al scriptului în funcție de valorile lor.
Pe baza variabilelor, argumentelor din linia de comanda sau datelor de intrare, un script poate lua decizii condiționate. Verificarea unei condiții poate duce la un comportament sau altul.
În rularea unui script adesea vom dori ca o acțiune să țintească mai multe fișiere sau procese sau șiruri. Pentru aceasta, vom urmări folosirea de bucle pentru parcurgerea de liste de elemente.
Comenzile folosite pot primi ca argument sau la intrarea standard ieșirea altor comenzi. În shell scripting folosim funcționalități de înlănțuire a comenzilor precum command expansion sau pipe-uri ducând la rezultate mai complexe.