Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Ori de cate ori se da o comanda din linia de comanda, aceasta este preluata de un program numit shell, care examineaza linia si decide care program trebuie rulat pentru a executa comanda si ce argumente ii vor fi transmise.
Procesorul de comenzi standard este sh (Bourne Shell). Alte procesoare de comenzi : csh (C Shell), ksh (Khorn Shell), bash (Bourne Again Shell) etc.
Procesorul implicit pentru un utilizator este specificat in descrierea sistem a utilizatorului, adica in fisierul /etc/passwd avand urmatoarea structura :
Utilizator |
Parola codificata |
Nr. Utilizator |
Nr. Grup |
Nume Complet |
Directorul HOME |
Procesor comenzi |
john |
yH1!2tW3 |
John Barry |
/home/stud/john |
/bin/sh |
Tabelul 6.4-
Obs.: Campurile sunt separate prin ':'.
Intotdeauna cand shell-ul este gata pentru a primi o comanda, el afiseaza un prompt care este de obicei de forma : '$ ' sau '% ', dar poate fi orice expresie.
In general toate comenzile au ca efect executia unor programe. Programele pot fi programe standard sau pot alte programe. Numele programului care va fi rulat este dat de primul cuvant din linia de comanda.
Numele programului poate fi specificat cu tot cu cale (/bin/cat) sau doar simplu numele, in acest caz shell-ul va cauta programul intr-o serie de directoare, serie numita PATH. Pe cele mai multe sisteme PATH-ul va consta din cel putin trei directoare : directorul curent('.'), si cele doua directoare sistem /bin si /usr/bin.
Inainte de a rula un program, shell-ul proceseaza linia de comanda pentru a determina ce argumente sa transmita programului. In cel mai simplu caz argumentele vor fi formate din secventa de caractere diferite de spatiu din linia de comanda.
Ex: $ ls -l myfile hisfile
In exemplul precedent argumentele vor fi cele trei siruri : -l, myfile si hisfile.
Exista o serie de caractere care au o semnificatie speciala pentru shell, ele numindu-se metacaractere si in principiu ar fi urmatoarele : < > | ^ & ; ? * [ ] ( ) $ ` ' '
Daca dorim ca vreunul din aceste caractere sa fie interpretat ca si un caracter obisnuit intr-un anumit context, el va trebui precedat de caracterul
Ex:
$ echo ? - vor fi listate numele fisierelor care au numele format dintr-un singur caracter.
$ echo ? - va fi afisat ?
Acesta este mecanismul de quoting (citare).
Daca dorim sa transmitem ca parametru un sir de caractere in care sa apara si spatiul atunci putem sa includem sirul de caractere intre apostroafe sau ghilimele.
Caracterele '*', '?' si '[]' sunt caractere care se folosesc pentru constructia unor tipare. Cand unul din aceste caractere este intalnit in linia de comanda, este inlocuit cu o lista de nume de fisiere care se potrivesc cu tiparul din care face parte, urmand urmatoarele reguli :
este inlocuit de zero sau mai multe caractere.
este inlocuit cu un singur caracter.
[sir] se potriveste cu orice caracter care este prezent in sir. Se permit si specificarea unor intervale : [a-z].
Exceptie de la aceste reguli sunt caracterele '/' si '.', care nu pot fi substituite prin aceste caractere.
Si in UNIX este posibila redirectarea dispozitivelor standard (intrarea standard, iesirea standard si iesirea de eroare standard). Pentru redirectare se folosesc caracterele '<' si '>'.
Ex:
$ ls -l >listing - provoaca crearea unui fisier avand ca si continut iesirea produsa de comanda ls -l.
$ cat <myfile - determina comanda cat sa citeasca din fisierul myfile si sa afiseze liniile citite.
In plus fata de aceste redirectari simple exista si alte tipuri de redirectare, dintre care cele mai folosite sunt :
>> fisier - adauga iesirea standard la sfarsitul fisierului specificat (daca fisierul nu exista acesta va creat).
<<terminator - foloseste urmatoarele linii ca si intrare standard, pana cand se intalneste linia care se potriveste cu tterminator-ul dat. Aceasta este folosita in fisiere de comenzi (shell scripts).
2>fisier - redirecteaza iesirea de eroare standard in fisierul specificat. Aceasta este defapt un caz special al cazului general de redirectare a unui identificator de fisier (stderr == 2).
O alta forma de redirectare este folosirea canalelor (pipelines). Intr-un canal doua sau mai multe programe sunt executate impreuna, iesirea unuia fiind intrarea urmatorului. In multe implementari ale UNIX-ului, programele dintr-un canal sunt executate concurent (in paralel). Principalul avantaj pentru utilizator este ca acesta permite o notatie concisa a unei operatii care pe alte sisteme ar necesita fisiere temporare.
Ex:
$ ls -l > fistemp1
$ grep *.c < fistemp1 > fistemp2
$ wc -l < fistemp2
Secventa de mai sus ar putea fi rescrisa folosind facilitatea de canal astfel :
$ ls -l | grep *.c | wc -l
Rezultatul ambelor grupuri de comenzi ar fi un numar precizand cate fisiere avand extensia .c exista in catalogul curent.
Dupa cum rezulta din exemplul de mai sus simbolul pentru crearea unui canal este o bara verticala '|'.
Motivul pentru care canalele sunt atat de folositoare este ca exista multe utilitare UNIX, cunoscute ca fiind filtre, care primesc un sir la intrare, il prelucreaza si transmit sirul rezultat la iesire (Astfel de utilitare sunt grep - cauta aparitia unor expresii in diferite fisiere, si wc - care in principiu contorizeaza caracterele dintr-un fisier).
Din cele prezentate pana acum a reiesit faptul ca sistemul UNIX este capabil de a executa concurent mai multe lucrari, el poate gestiona simultan mai multi utilizatori, poate rula mai multe comenzi grupate in canale pentru un utilizator. In plus un utilizator poate rula explicit mai multe comenzi independente in acelasi timp. Aceasta este posibil datorita rularii comenzilor in background, pentru a specifica executia in fundal a unei comenzi, aceasta va fi urmata de caracterul '&'. Daca executia este in fundal, tastatura este imediat disponibila pentru introducerea unei noi comenzi.
Ex:
$ ls -l /usr/bin &
Numarul [Nr] este identificatorul de proces al comenzii date. Acest identificator poate fi folosit pentru manipularea acestor procese, de exemplu pentru terminarea fortata a proceselor.
Ex:
$ kill -9 524
Pentru comenzile care se executa in fundal, trebuie procedat in asa fel incat iesirea , respectiv intrarea lor sa nu fie ecranul respectiv tastatura, pentru aceasta se pot folosi redirectarile.
Ex:
$ ls -l /usr/bin > lista &
In plus pentru manipularea proceselor exista cateva utilitare care permit triumiterea unui proces in background (bg), respectiv aducerea lor in foreground (fg). Pentru a vedea situatia proceselor exista comanda ps (Process Status).
Pentru a putea specifica mai mult de o comanda pe o singura linie acestea se pot desparti prin caracterul ';'
Ex:
$ ls -l > lista ; grep *.c < lista
Caracterul ';' forteaza executia comenzilor intr-o ordine secventiala, adica pentru a se executa o comanda, trebuie ca toate comenzile precedente sa se fi terminat.
Pentru a grupa mai multe comenzi se pot folosi parantezele '(' si ')'.
De exemplu daca s-ar fi dorit executia comenzilor precedente in background atunci :
$ ls -l > lista ; grep *.c < lista &
nu ar avea efectul dorit, deoarece doar cea de a doua comanda s-ar executa in background, prima s-ar executa tot in foreground. Dar daca comenzile ar fi grupate astfel :
$ (ls -l > lista ; grep *.c < lista)&
atunci am avea rezultatul dorit.
Copyright © 2024 - Toate drepturile rezervate