Sunteți pe pagina 1din 6

Laborator

Sisteme de Operare
- Comenzi UNIX -
Shell Unix
Shell-ul este principala interfaţă de comunicare între utilizator şi sistemul de
operare. Deşi, în mod intuitiv, shell-ul este identificat cu o interfaţă în linia de
comandă, poate fi şi o interfaţă grafică. Un exemplu îl constituie aplicaţia Explorer a
sistemului de operare Windows.
În continuare ne vom oferi la interfaţa de tip CLI (Command Line Interface)
oferită de sistemele de operare UNIX. Deşi este mai greu de învăţat decât o interfaţă
grafică, CLI permite un control mult mai bun al sistemului. Mai mult, shell-ul
dispune de un limbaj de programare.
Un program shell, denumit script shell, este folosit pentru a îmbina mai multe
comenzi şi diverse structuri de control pentru a obţine o nouă funcţionalitate sau
pentru automatizarea sarcinilor. În acest fel un script shell este un instrument
esenţial pentru sarcinile administrative şi alte rutine repetitive care nu necesită
funcţionalităţi ale unor limbaje de programare avansate.
În cadrul laboratoarelor ne vom referi la shell-ul Bash (Bourne Again SHell).
Există şi alte shell-uri pe sisteme UNIX precum tcsh, zsh, ash, etc. De curând,
Microsoft oferă PowerShell pe sistemele Windows. PowerShell are o abordare
orientată pe obiecte şi un set de funcţionalităţi care acoperă nevoile de administrare
ale unui sistem Windows.

Exemplu “Hello world”


Un script simplu care doar afişează mesajul "Hello, World!" este următorul:

#!/bin/bash
# afiseaza mesaj
echo "Hello, World!"
exit 0

Este necesar ca fişierul să fie executabil pentru a putea fi interpretat. Acest


lucru se poate realiza cu ajutorul comenzii chmod care conferă in acest caz dreptul de
execuţie proprietarului fişierului :

$> chmod u+x hello.sh

Şirul #! de la începutul fişierului poartă denumirea de shebang. Acesta indică


sistemului ce program va fi invocat pentru a interpreta scriptul. Un script poate fi
rulat si prin precizarea explicită a interpretorului în linia de comandă:

$> bash hello.sh

În această situaţie nu este nevoie ca scriptul sa fie executabil şi nici nu este


nevoie de prezenţa liniei #!/bin/bash. Caracterul # semnifică începutul unui
comentariu care durează pană la sfârşitul liniei. Comanda exit este folosită pentru a
indica valoarea de retur a scriptului. Implicit aceasta valoare este 0 (cu alte cuvinte
nu era necesar să apară în script).

Comenzi UNIX uzuale


Comanda ls

Listează conţinutul directoarelor.

Sintaxa: ls [opţiuni] director Opţiuni:

-d // afişează numai directoarele din directorul curent.


-l // afişează informaţiile în format lung: drepturi de acces, număr de legături,
mărimea, etc.
-s // afişează numărul de blocuri pentru fiecare fişier.
-t // fişierele sunt sortate după data ultimei actualizări

Exemplu: ls -lt /usr

Comanda chmod

Schimba drepturile de acces la un fişier ordinar sau director.

Sintaxa: chmod atr fişier(e)

atributul se exprimă ca un număr octal din patru cifre sau printr-o combinaţie de
forma:

[u | g | o | a] [+ | - | =] [r | w | x ]

+ adaugă permisiune ; - şterge permisiune; = atribuie permisiune


u - proprietarul ; g – grupul ; o - restul utilizatorilor ; a – toţi utilizatorii
r – Read ; w – Write ; x – eXecute

Exemplu:

chmod o-x f1 // Şterge dreptul la execuţie pentru restul utilizatorilor.


chmod 0774 f1 // Fisierul f1 va avea permisiunile de acces rwxrwxr--.

Alte comenzi uzuale

cd - schimbă directorul curent.

cp - copiază un fişier în altul sau fişiere într-un director.

echo - afişează argumentele sale la terminal. Comanda se utilizează în special în


fişiere de comenzi pentru a afişa diferite mesaje.

man - afişează conţinutul manualului programatorului UNIX, legat de un anumit


subiect.
mkdir - creează un director. Intrările . şi .. sunt create automat.

mv - redenumeşte un fişier sau mută un fişier într-un director.

pwd - afişează numele complet al directorului curent.

rm - sterge un fişier sau director.

rmdir - sterge un director dacă acesta este vid.

who - afişează numele utilizatorilor conectati în sistem.

Concatenarea comenzilor
Shell-ul prezintă o serie de operatori folosiţi pentru îmbinarea comenzilor.
Următorii operatori sunt folosiţi pentru concatenarea diverselor comenzi:

command1 ; command2 - comenzile sunt executate secvenţial (una după alta)


command1 && command2 - command2 este executată numai dacă command1 are valoare de retur 0
command1 || comand2 - command2 este executată numai dacă command1 are valoare de retur nenula

Inlantuirea comenzilor
Înlănţuirea comenzilor se realizează folosind operatorul | (pipe). In aceasta
situaţie ieşirea unei comenzi devine intrarea pentru cealaltă. De exemplu:

ls -l | more

aplică filtrul more pe rezultatul comenzii ls.

Redirectări
Comenzile pot fi redirectate dinspre intrarea standard, ieşirea standard si
eroarea standard către un fişier. O parte din operatorii folosiţi pentru redirectare sunt:

> - redirectarea ieşirii standard


2> - redirectarea erorii standard
2>&1 - redirectarea erorii standard in ieşirea standard.
< - redirectarea intrării standard

Pattern matching
In interacţiunea cu sistemul de fişiere se doreşte selectarea rapida a mai
multor fişiere după câteva caracteristici de nume comune. Operaţia efectuata de shell
se numeşte pattern matching. Exista următoarele caractere speciale:

* - se potriveşte cu orice sir de caracter, inclusiv şirul vid


? - se potriveşte cu un singur caracter
[...] - se potriveşte cu unul din caracterele din set; poate fi de genul [abc] sau [a-gA-G] sau [0-5h-zH-Z]
Comenzi utile in elaborarea scripturilor
Comenzile echo, cat şi tac

Comanda echo este folosită pentru a afişa un şir de caractere, o variabilă la


ieşire standard. Comanda cat afişează conţinutul unui fişier sau al intrării standard.
Comanda tac afişează conţinutul unui fişier inversat.

Comanda find

Comanda find este o comandă fundamentală pentru parcurgerea intrărilor


dintr-o ierarhie a sistemului de fişiere. Opţiunea exec este folosită pentru a rula o
comandă pentru fişierele găsite. Şirul {} este special şi se înlocuieşte cu numele
fişierului găsit de find. Caracterul ; (citat cu ajutorul backslash) indică încheierea
comenzii de executat. Exemplu următor caută toate fişierele sursa C din arborescenta
directorului curent si afişează câteva informaţii despre acestea :

find . –name « *.c » -exec ls –l {} \;

Filtre de text

Variabilele, structurile de control si procedurile sunt întâlnite in toate


limbajele de programare. Ce face insa un script shell indicat pentru sarcini
administrative si repetitive este posibilitatea de îmbinare a comenzilor simple, de
lucru cu fişierele sistemului pentru a obţine informaţiile dorite si pentru a adăuga o
noua funcţionalitate. De obicei aceste sarcini necesita o procesare sofisticata. In
aceste situaţii se folosesc filtrele de text. Comenzi folosite ca si filtre de text sunt head,
tail, grep, sort, tr, cut.

Comenzile head şi tail

Cele doua comenzi sunt folosite pentru afişarea numai a primelor sau a
ultimelor linii de text din cadrul unui fişier. Sintaxa lor este asemănătoare:

head [-n lines] files


tail [-n lines] files

Primul argument, daca exista, afişează primele, respectiv ultimele n linii din
text. Lipsa acestuia impune n = 10. In cazul comenzi tail o opţiune utila este -f care
menţine fişierul de vizualizat deschis pe măsură ce programele scriu in el, spre
exemplu pentru a vizualiza un fişier de log pe măsură ce informaţiile sunt scrise in el.

Comanda grep

Comanda grep permite localizarea liniilor intr-un fişier care conţine o expresie
căutată. Sintaxa de baza este :

$ grep word file

file este numele fişierului in care vrem sa găsim cuvântul word. Un exemplu de
utilizare este:
grep -r -l "#include <sys/wait.h>" .

Când nu se precizează un fişier se foloseşte intrarea standard, grep devenind


ideal pentru lucrul cu pipe-uri. O alta opţiune utila este -v. Aceasta permite căutarea
acelor linii care NU conţin cuvântul transmis ca parametru. Opţiunea -n permite
afişarea numărului liniei care conţine cuvântul căutat.

Comanda tr

Comanda tr (transliterate) este folosita pentru a translata caracterele dintr-un


set de caractere intr-un alt set de caractere. Sintaxa de baza este:

tr 'set1' 'set2'

Daca dorim sa translatam literele mari in litere mici, folosim:

$ tr 'A-Z' 'a-z' < file

In cazul in care setul set2 are mai puţine caractere decât setul set1 acestea vor
fi multiplicate pentru a ajunge la aceeaşi dimensiune. Următorul pas ar fi eliminarea
spatiilor redundante. Opţiunea -s (squeeze) înlocuieşte o succesiune de doua sau mai
multe caractere cu unul singur. Opţiunea –c (complement) realizează
complementarea primului sir de caractere (set1). Opţiunea –d (delete) elimina toate
caracterele din fişier ce sunt prezente in primul set.

Comanda sort

Comanda sort este utilizata pentru sortarea liniilor alfabetic. O opţiune utila in
cazul sort este sortarea după valoarea numerica a şirurilor. Pentru aceasta folosim -n.
De multe ori ieşirea apare intr-o forma in care elementele de sortat sunt intr-o alta
coloana (nu prima, cea folosita implicit de sort). Pentru aceasta se poate folosi
opţiunea -k (key). Sintaxa, in cazul folosirii acestei opţiuni, este:

sort -k start, end file

Start este coloana de start a cheii, iar end este coloana de stop a cheii. Prima
coloana este cea după care se face sortarea, iar, in cazul in care sunt doua sau mai
multe elemente egale, se face deosebirea intre acestea folosind coloana următoare.

Comanda wc

Comanda wc (word count) este folosita pentru a contoriza numărul de linii, de


cuvinte sau de caractere dintr-un text sau de la intrarea standard. Pentru aceasta i se
pot specifica opţiunile -c, -w, -l.

Comanda cut

Comanda cut selectează numai anumite părţi (coloane) ale fişierului de intrare
sau ale intrării standard. Sintaxa cea mai folosita este:

cut -d delim -f fields


Folosindu-se delimitatorul delim se vor selecta numai câmpurile fields.
Exemplu următor selectează primul si al treilea câmp din fişierul de mai jos:

Astazi e primul laborator


Exersam comenzi Unix
Maine invatam Shell

Cut –d “ ” –f1,3

Astazi primul
Exersam Unix
Maine Shell

Exercitii propuse
1. Afişaţi numele tuturor fişierelor prezente in arborescenta directorului curent care
au extensia « .c ».

2. Calculaţi numărul de fişiere cu extensia « .c » din arborescenta directorului curent.

3. Ştergeţi toate fişierele cu extensia « .txt » care nu sunt vide din arborescenta
directorului curent.

4. Calculaţi suma numerelor de caractere corespunzătoare tuturor fişierelor din


directorul curent.

5. Calculaţi numărul total de linii care conţin un anumit sir de caractere (ales de voi)
din toate fişierele directorului curent.

6. Calculaţi numărul de linii ce conţin cuvântul daemon intre primele 20 de linii ale
fişierului /etc/passwd.

7. Afişaţi caracteristicile celui de-al treilea obiect (fişier sau director) din directorul
curent, obiectele fiind ordonate in ordine cronologica a ultimei modificări.

8. Calculaţi numărul de vocale dintr-un fişier dat.

9. Calculaţi numărul de apariţii ale unui sir de caractere (fără spatii) dintr-un fişier.
Nu se va număra decât o singura apariţie a motivului căutat intr-un cuvânt din fişier
(ex. şirul « ba » in cuvântul “baba babababa ba” apare de 3 ori).

De asemenea, este posibil ca motivul căutat sa apară de mai multe ori in cadrul
aceleiaşi linii intr-un fişier. Ca separator se va considera spaţiu.

10. Listaţi pentru toate directoarele conţinute in directorul curent următoarele


informaţii : numele proprietarului, numele directorului, data ultimei modificări.

11. Calculaţi lungimea celei mai lungi linii dintr-un fişier dat.