Comenzi inglobate
Introducere
Comenzile inglobate sau interne (built-in commands) sunt comenzi ce pot fi apelate din interiorul unui
shellscript sau de la linia de comanda. Shell-ul are 32 de comenzi inglobate. Fiecare comanda ce este
executata returneaza un exit-code. Atunci cand comanda nu se termina pe o singura linie, shell-ul
prompteaza (al doilea prompter este >) utilizatorul pentru introducerea caracterelor de continuare
pana cand se incheie comanda.
Exemplu:
$for i in f1 f2
>do
>file $i
>done
$
getopts
Exista posibilitatea ca un shellscript sa fie apelat cu optiuni. Daca un shellscript denumit test.cmd
are urmatoarea sintaxa: test.cmd [-a] [-b] [-c], atunci el poate fi apelat in oricare dintre modalitatile urmatoare:
test.cmd -a
test.cmd -abc
test.cmd
test.cmd -a -b
test.cmd -a -b -c
...s.a.m.d
In acest caz vom folosi getopts in interiorul uneia dintre instructiunile for, while sau until.
getopts returneaza "true" atata timp cat exista optiuni ce trebuie luate in considerare.
Formatul general este:
getopts <optiuni> <variabila>
Exemplu. Fie shellscript-ul test.cmd:
# test.cmd
...
while getopts abc optiune
do
...
done
Care este modalitatea de lucru a lui getopts ? Spre exemplu, daca apelul s-a facut
test.cmd -abc, comanda getopts verifica prima data daca exista o liniuta (-)
in linia de comanda. Verifica apoi daca litera ce urmeaza este una dintre optiunile valide
daca optiunea este valida, atunci ea este memorata in variabila optiune. In acest moment este
returnat un exit status zero, deci corpul ciclului while este executat. Optiunile urmatoare sunt tratate
in mod asemanator. Atunci cand se epuizeaza toate optiunile, getopts returneaza o valoare diferita de zero
si astfel ciclul while se incheie.
In cazul aparitiei unei optiuni invalide, spre exemplu se face apelul test.cmd -abcd, optiunile corecte sunt tratate
ca mai sus, iar optiunea invalida d este considerata si ea de getopts deoarece face
parte din grupul precedat de -. In acest caz, getopts ia valoarea ?, apoi returneaza un exit status zero
si corpul ciclului while este executat. Shellscript-ul va contine cod corespunzator pentru
fiecare optiune valida. Un exemplu ar putea fi acela construit cu un case:
while getopts abc optiune
do
case "$optiune" in
a) ...;;
b) ...;;
c) ...;;
\?) echo "Optiune invalida..."
esac
...
done
Fie un nou shellscript, cu urmatorul format:
test2.cmd [-a] [-b] [-c] infocib
Optiunile a,b si c sunt tratate ca mai inainte iar getopts intoarce o valoare diferita de zero deoarece argumentul infocib nu este o optiune.
Ciclul se termina drept rezultat al aparitiei unei valori false (diferita de zero) iar argumentul
infocib este luat in considerare in continuare, dupa ciclul getopts.
Fie acum cazul in care o optiune necesita si o valoare ce trebuie specificata. Fie shellscript-ul
test3.cmd [-a] [-b argument] <nume_fisier>
Comanda getopts devine: geopts ab: optiune, unde aparitia semnului : inseamna ca aceasta optiune trebuie urmata de cel putin un
caracter whitespace si de un argument. Argumentul va fi memorat intr-o variabila speciala numita OPTARG.
Daca linia de comanda contine -b fara nici un argument in continuare, in variabila optiune
este memorat un ?. O alta variabila speciala, numita OPTIND este incrementata de fiecare data cand getopts
returneaza o valoare. Ea are initial valoarea 1. Se poate verifica in acest mod daca a fost introdus argumentul specificat pentru executia corecta a comenzii.
Astfel, in apelul test3.cmd -a -b nume infocib , daca valoarea lui OPTIND este mai mare decat
valoarea lui $# atunci numele fisierului <nume_fis> pentru executia corecta a scriptului nu a fost introdus.
hash
Este folosita pentru marirea vitezei primirii comenzilor.
Comanda hash [-r] <comenzi>
"spune" shell-ului sa caute comanda sau comenzile specificate si sa adauge directorul incare sunt localizate la
"lista hash". Spre exemplu, odata executata comanda hash inter, urmatoarele apeluri catre shellscript-ul
inter ce vor executa cu viteza mai mare. Daca folosim hash fara nici un argument, se va afisa
o lista cu comenzi ce sunt deja in lista hash. Optiunea -r se foloseste atunci cand
dorim stergerea din lista a unei comenzi.
hash -r sterge toate componentele listei.
Comanda hash fara nici un argument afiseaza toate componentele listei.
type sh
Afiseaza informatii despre comanda sau comenzile specificate, avand sintaxa:
type <comenzi>
Poate fi folosita impreuna cu:
comenzi interne
comenzi Unix
shellscript-uri
functii
newgrp
Modifica pentru un utilizator Unix identificatorul de grup (group_id). Are sintaxa:
newgrp [<nume_grup>]
Presupunand ca grupul utilizatorului este cibernetica si trebuie schimbat in comert,
comanda este:
newgrp comert
Pentru motive legate de securitatea sistemjului, modificarea este permisa doar daca utilizatorul apare in lista membrilor grupului comert
din fisierul /etc/group. Cu ajutorul acestei modificari, utilizatorul poate accesa programe disponibile grupului comert.
ulimit
Dimensiunea fisierului pe care un proces copil il poate scrie este limitata de un anumit numar de
blocuri folosind comanda ulimit. Sintaxa acesteia este:
ulimit [<dimens_fisier>]
Pentru a afla setarea curenta, introducem pur si simplu comanda fara nici un argument. Utilizatorul obisnuit poate micsora
dimensiunea; doar root poate creste aceasta dimensiune.
umask
Determina drepturile de acces implicite (default mask). Acestea sunt create folosind valori octale.
Pentru un fisier obisnuit, drepturile de acces deplin sunt:
-rw-rw-rw-
cu valoarea octala a reprezentarii 666. Dreptul de acces pentru un anumit fisier se obtine scazand
din 666 valoarea lui umask. In general, valoarea lui umask este setata de root la valoarea
octala 022. se obtine deci valoarea 666-022=644, care reprezinta drepturile:
-rw-r--r--
Daca dorim drepturi depline de acces, vom seta umask la valoarea 0, prin comanda umask 0.
Pentru un director, drepturile depline de acces sunt:
-rwxrwxrwx (777 in octal)
Dreptul x (de executie) pentru un director ofera utilizatorului dreptul de citire. Astfel, dreptul de acces la director se
obtine scazand din 777 valoarea lui umask: 777-022=755, care reprezinta drepturile:
-rw-r-xr-x
times
Aceasta comanda se foloseste pentru afisarea de catre shell a timpului necesitat de toate procesele
rulate de shell. Sunt listate atat timpul utuilizator cat si cel sistem. Fie exemplul:
$times
0m30s 3m30s
Primul timp reprezinta 30 de secunde petrecute in mod utilizator iar cel de-al doilea timp este timpul
ce a fost alocat proceselor sistem.
eval
Comanda eval asigura evaluarea completa a unei variabile. Fie exemplul:
$dir_curent='$pwd'
$echo $dir_curent
$pwd
in cazul lui eval avem:
$eval $dir_curent
/home/stud/an3/i97zzz
|