bash [optiuni] [fisier]
Pe linga optiunile mono-caracter de shell prezentate in descrierea setului de comenzi interne ale shell-ului, bash interpreteaza, cind este apelat, si urmatoarele flaguri:
Bash mai interpreteaza si un numar de optiuni multicaracter. Aceste optiuni, pentru a fi recunoscute, trebuie sa apara in linia de comanda inaintea optiunilor mono-caracter.
| & ; ( ) < > spatiu tab
|| & && ; ;; ( ) |
! case do done elif else esac fi for function
if in select then until while { }
Valoarea intoarsa de o comanda simpla este starea ei de iesire, sau 128+n daca comanda este incheiata de catre semnalul n.
[ ! ] comanda1 [ | comanda2 ... ]Iesirea standard a comenzii 1 este conectata la intrarea standard a comenzii 2. Aceasta conectare este realizata inaintea oricaror redirectionari specificate de comanda (vezi si REDIRECTIONARE).
Daca cuvintul rezervat ! precede o pipeline, starea de iesire a acelei pipeline este NU-ul logic al starii de iesire a ultimei comenzi. Altfel, starea de iesire este starea de iesire a ultimei comenzi. Shellul asteapta ca toate comenzile din pipeline sa fie incheiate inainte de a intoarce vreo valoare.
Fiecare comanda dintr-o pipeline e executata ca un proces separat (adica intr-un subshell).
Dintre acesti operatori de lista, && si || au prioritate egala, fiind urmati de ; si &, care au tot prioritate egala intre ei.
Daca o comanda se incheie cu operatorul de control &, shellul executa comanda in background, intr-un subshell. Shellul nu asteapta sa se incheie executia comenzii, si starea de iesire este 0. Comenzile despartite prin ; sunt executate secvential (pe rind); shellul asteapta ca fiecare comanda sa se termine, pe rind. Starea intoarsa este starea de iesire a ultimei comenzi executate.
Operatorii de control && si || denota liste SI si liste SAU, respectiv. O lista SI are forma:
comanda1 && comanda2Comanda 2 este executata daca si numai daca prima comanda intoarce o stare de iesire 0.
O lista SAU are forma
comanda1 || comanda2Comanda 2 este executata daca si numai daca prima comanda intoarce o stare de iesire diferita de 0. Starea de iesire a unei liste SI sau SAU este starea de iesire a ultimei comenzi executate din lista.
Fiecare dintre metacaracterele enumerate mai sus la DEFINITII are o semnificatie specifica pentru shell si trebuie citate daca trebuie sa fie luate in sensul lor literal. Exista trei metode de citare: caracterul-escape, ghilimele simple (apostroafe, ') si ghilimele duble (ghilimele propriu-zise, ").
Un backslash (\) este caracterul-escape. El va face sa fie pastrata
valoarea literala a urmatorului caracter, cu exceptia caracterului
Includerea caracterelor intre apostroafe pastreaza valoarea literala
a fiecarui caracter dintre cele incluse. Intre apostroafe nu poate sa
apara un apostrof, nici macar precedat de backslash.
Includerea caracterelor intre ghilimele duble pastreaza valoarea
literala a tuturor caracterelor dintre ghilimele, cu exceptiile:
$, `, si \. Caracterele $ si ` isi pastreaza semnificatiile speciale
si intre ghilimele duble. Backslash-ul (\) isi pastreaza semnificatia
speciala numai atunci cind e urmat de unul din urmatoarele caractere:
$, `, ", \, sau
Parametrii speciali * si @ au semnificatii speciale atunci cind sunt
intre ghilimele duble (vezi si PARAMETRI).
Un parametru este o entitate care memoreaza valori, oarecum similar
cu o variabila dintr-un limbaj de programare. Poate fi un nume, un
numar, sau unul dintre caracterele speciale enumerate la Parametri
Speciali. Pentru scopurile shell-ului, o variabila este un parametru
desemnat printr-un nume.
Un parametru este setat daca i s-a atribuit o valoare. Sirul nul este
o valoare valida. Dupa ce o variabila a fost setata, ea poate fi
de-setata numai folosind comanda interna "unset" (vezi COMENZILE
INTERNE DE SHELL).
O variabila poate primi o valoare printr-o instructiune de forma:
Cind este expandat un parametru pozitional care consta in mai mult de
o singura cifra, el trebuie inclus intre paranteze (vezi EXPANDARE).
Ordinea expandarilor este: expandare de paranteze, expandare de
tilda, substituire de parametri, variabile, comenzi si aritmetica (de
la stinga la dreapta), impartire in cuvinte si expandarea numelui
caii de acces.
Pe sistemele care o pot suporta, este disponibil inca un tip de
expandare: substituire de procese.
Numai expandarea de paranteze, impartirea in cuvinte si expandarea
numelui caii de acces pot schimba numarul de cuvinte din expandare;
celelalte expandeaza de la un singur cuvint la un singur cuvint.
Singura exceptie este expandarea lui ``$@'', asa cum s-a explicat mai
sus (vezi PARAMETRI).
Expandarile de paranteze pot fi facute pe mai multe nivele.
Rezultatele expandarii fiecarui sir nu sunt sortate: ordinea de la
stinga la dreapta e pastrata. De exemplu, a{d,c,b}e se expandeaza la
`ade ace abe'.
Expandarea de paranteze e facuta inainte de orice alta expandare, si
orice caracter cu rol special in alte expandari e pastrat in rezultat.
Este un proces strict textual. Bash-ul nu face nici o interpretare
sintactica a contextului expandarii sau textului dintre paranteze.
O expandare de paranteze corect construita trebuie sa contina
paranteze de deschidere si inchidere, necitate, si cel putin o virgula
necitata. Orice expandare de paranteze incorect construita este lasata
nemodificata.
Aceasta constructie e folosita uzual ca scurtatura atunci cind
prefixul comun sirurilor ce trebuie generate e mai lung decit in
exemplul de mai sus:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
sau
chown root /usr{ucb/{ex,edit},lib/{ex?.?*, how_ex}}
Expandarea de paranteze introduce o usoara incompatibilitate cu
versiunile traditionale de sh, shell-ul Bourne. Sh-ul nu trateaza in
mod special parantezele de deschidere si inchidere atunci cind ele
apar ca parte a unui cuvint, si le pastreaza la iesire. Bash-ul
elimina parantezele din cuvinte, ca urmare a expandarii de paranteze.
De exemplu, un cuvint introdus in sh ca file{1,2} apare la fel la
iesire. Acelasi cuvint va apare, dupa expandarea din bash, sub forma
file1 file2. Daca se doreste o compatibilitate stricta cu shell-ul sh,
atunci trebuie lansat bash-ul cu optiunea -nobraceexpansion (vezi mai
sus OPTIUNI) sau se va dezactiva expandarea de paranteze cu optiunea
+o braceexpand a comenzii "set" (vezi COMENZILE INTERNE DE SHELL).
Daca un `+' urmeaza tilda, atunci valoarea lui PWD va inlocui tilda
si semnul plus. Daca o urmeaza un `-' (minus), se pune in loc
valoarea lui OLDPWD. Daca valoarea care urmeaza tilda este un nume
de login valid, tilda si numele de login sunt inlocuite cu directorul
home asociat acelui nume de login. Daca numele e invalid, sau daca
expandarea de tilda esueaza, cuvintul ramine neschimbat.
Fiecare atribuire de valoare unei variabile e verificata pentru a se
gasi aparitii necitate ale tildei dupa : sau =. Si in aceste cazuri
se realizeaza substituirea de tilda. In consecinta, se pot folosi nume
de cai de acces cu tilde in atribuirea de valori pentru parametrii
PATH, MAILPATH si CDPATH, iar shell-ul le va atribui valorile
expandate.
$(comanda)
sau
`comanda'
Bash-ul realizeaza ezpandarea executind comanda si inlocuind
substituirea de comenzi cu iesirea standard a comenzii, fara sa
stearga caracterele "rind nou" de la sfirsit.
Cind este folosita forma de stil vachi cu apostroafe, backslash-ul
ii pastreaza sensul ei literal, cu exceptia cazurilor cind e urmat de
$, ` sau \. Cind se foloseste forma ${comanda}, toate caracterele
dintre paranteze alcatuiesc comanda; nici unul nu e tratat special.
Substituirile de comenzi pot fi continute unele in altele. Pentru a
face asta folosind vechea forma, apostroful interior trebuie precedat
de backslash, pentru a-i pastra sensul real.
Daca substituirea apare intre ghilimele, asupra rezultatelor nu se
efectueaza separarea in cuvinte si expandarea de cale de acces.
Evaluarea se face conform regulilor listate mai jos sub titlul
EVALUAREA ARITMETICA. Daca expresia este invalida, bash-ul scrie un
mesaj indicind esecul si nu are loc nici o substituire.
Pe sistemele care o suporta, substituirea de comenzi este efectuata
simultan cu expandarea de variabile, substituirea de comenzi si
expandarea aritmetica.
Shell-ul trateaza fiecare caracter din variabila IFS ca delimitator,
si desparte rezultatele celorlalte expandari in cuvinte, dupa aceste
caractere. Daca valoarea luiIFS este exact
Argumentele explicit nule ("" sau '') sunt pastrate. Argumentele nule
in mod implicit, rezultate din expandarea parametrilor care nu au
valori, sunt sterse.
Daca nu are loc nici o expandare, nu se efectueaza nici o separare
in cuvinte.
Caracterele speciale ale tiparului au urmatoarele semnificatii:
Inainte ca o comanda sa fie executata, intrarea si iesirea ei pot fi
redirectionate folosind o notatie speciala care e interpretata de
shell. Redirectionarea mai poate fi folosita si pentru a inchide si
deschide fisiere pentru mediul de executie al shell-ului curent.
Operatorii de redirectionare de mai jos pot precede sau pot aparea
oriunde intr-o comanda simpla, sau pot urma comanda. Redirectionarile
sunt procesate in ordinea aparitiei, de la stinga spre dreapta.
In descrierile de mai jos, daca se omite numarul ce descrie fisierul,
si daca primul caracter al operatorului de redirectionare este <,
atunci redirectionarea se refera la intrarea standard (fisierul 0).
Daca primul caracter al operatorului de redirectionare este >, atunci
redirectionarea se refera la iesirea standard (fisierul 1).
Cuvintul ce urmeaza dupa operatorul de redirectionare in descrierile
de mai jos este supus la expandare de paranteze, de tilda, de
parametri, substituire de comenzi, expandare aritmetica, inlaturarea
semnelor citarii si expandarea caii de acces. Daca el e expandat la
mai mult de un cuvint, bash-ul raporteaza o eroare.
Retineti ca ordinea redirectionarilor este importanta. De exemplu,
comanda:
Formatul general pentru redirectionarea intrarii este:
Formatul general pentru redirectionarea iesirii este:
Formatul general pentru adaugarea iesirii este:
Exista doua forme de redirectionare a iesirii si erorii standard:
&>cuvint
si
>&cuvint
Dintre cele 2 forme, prima e preferata. Ea e echivalenta semantic cu:
Formatul acestei redirectionari este urmatorul:
Daca in cuvint exista caractere citate, delimitatorul este rezultatul
inlaturarii semnelor citarii din cuvint, iar rindurile din documentul
"aici" nu sunt expandate. Altfel, toate rindurile din documentul-
prezent sunt supuse expandarii de parametri, substituirii de comenzi,
si expandarii aritmetice. In ultimul caz, perechea \
Daca operatorul de redirectionare este <<-, atunci toate caracterele
TAB de la inceput de rind sunt eliminate din rindurile de intrare si
din rindul ce contine delimitatorul. Aceasta permite ca documentele-
prezente cuprinse in scripturi de shell sa fie indentate natural.
Operatorul
Variabilele locale ale functiei pot fi declarate cu comanda interna
"local". De regula, variabilele si valorile lor sunt accesate in
comun de functie si de apelatorul ei.
Daca intr-o functie este executata comanda interna "return", functia
se incheie si executia continua cu urmatoarea comanda de dupa apelul
functiei. Cind o functie se incheie, valorile parametrilor
pozitionali si a parametrului special # sunt restaurate la valorile
avute inainte de executia functiei.
Numele si definitiile functiilor pot fi listate cu optiunea -f la
comenzile interne "declare" sau "typeset". Functiile pot fi exportate
cu optiunea -f la comanda interna "export", astfel ca subshell-urile
sa le aiba automat definite.
Functiile pot fi recursive. Nu se impune nici o limita asupra
numarului de apeluri recursive.
Alias-urile sunt create si listate cu comanda "alias", si sunt sterse
cu comanda "unalias".
Nu exista nici un mecanism pentru folosirea argumentelor in textul de
pus in loc, ca in shell-ul csh. Daca sunt necesare argumente, trebuie
folosita o functie de shell.
Alias-urile nu sunt expandate cind shell-ul nu este interactiv.
Regulile ce guverneaza definirea si utilizarea alias-urilor sunt cam
confuze. Bash-ul citeste intotdeauna cel putin un rind complet de
intrare inainte de executarea oricarei comenzi de pe acel rind.
Alias-urile sunt expandate cind o comanda este citita, si nu cind e
executata. De aceea, o definitie de alias care apare in acelasi rind
cu o alta comanda nu are efect pina la citirea urmatorului rind de
intrare. Asta inseamna ca noul alias nu afecteaza comenzile care il
urmeaza pe acelasi rind. Acest comportament pune probleme si atunci
cind se executa o functie. Alias-urile sunt expandate atunci cind se
citeste definitia functiei, si nu cind este executata functia,
deoarece insasi definitia unei functii este o comanda compusa. In
consecinta, alias-urile definite in cadrul unei functii nu devin
valabile decit dupa ce acea functie a fost executata. Pentru
siguranta, definitiile de alias-uri se vor pune intotdeauna pe un
rind separat, si nu se vor folosi alias-uri in comenzi compuse.
De retinut ca aproape in orice scopuri, alias-urile sunt inlocuite
de functiile de shell.
Shell-ul asociaza un job fiecarei "pipeline". El pastreaza un tabel
cu joburile aflate in executie curenta, care poate fi afisata cu
comanda "jobs". Cind bash-ul porneste asincron un job (in fundal -
in background), el afiseaza un rind care arata cam asa:
Pentru a facilita implementarea interfetei de utilizator pentru
controlul job-urilor, sistemul pastreaza notiunea de identificator
(ID) al grupului de procese al terminalului curent. Membrii acestui
grup de procese (procese al caror ID de grup de procese este egal cu
ID-ul grupului de procese al terminalului curent) primesc semnalele
generate de tastatura, precum SIGINT. Se spune ca aceste procese sunt
in prim-plan (in "foreground"). Procesele din background sunt acelea
al caror ID de grup de procese e diferit de cel al terminalului
curent; astfel de procese sunt imune la semnalele generate de
tastatura. Numai proceselor din foreground li se permite sa citeasca
de la terminal sau sa scrie la terminal. Proceselor din background ce
incearca sa citeasca de la (sau sa scrie la) terminal li se trimite
un semnal SIGTTIN (SIGTTOU) de catre driver-ul de terminal, care, in
afara de cazul ca este interceptat, suspenda procesul.
Daca sistemul de operare pe care ruleaza bash-ul suporta controlul
job-urilor, bash-ul iti permite sa-l folosesti. Introducerea de la
tastatura a caracterului de suspendare (de regula ^Z, Control-Z) in
timpul executiei unui proces provoaca stoparea acelui proces si
revenirea ta in bash. Introducerea caracterului de suspendare cu
intirziere (de regula ^Y, Control-Y) face ca procesul sa fie stopat
atunci cind incearca sa citeasca intrarea de la terminal, si
controlul va fi returnat bash-ului. Apoi poti manipula starea acelui
job folosind comanda "bg" pentru a-l continua in background, comanda
"fg" pentru a-l continua in foreground, sau comanda "kill" pentru
a-l elimina complet. Un ^Z are efect imediat, si are efectul secundar
ca vor fi neglijate iesirile si intrarile aflate in asteptare.
Exista mai multe metode de a face referire la un job din shell.
Caracterul % introduce un nume de job. Numarul de job n poate fi
referit ca %n. Un job mai poate fi referit si folosind un prefix al
numelui folosit pentru a-l lansa, sau folosind un substring care
apare in linia lui de comanda. De pilda, %ce se refera la un job "ce"
stopat. Daca un prefix coincide cu mai mult de un job, bash-ul va
raporta o eroare. Pe de alta parte, folosirea formei $?ce se refera
la orice job care contine stringul "ce" in linia sa de comanda. Daca
substringul coincide cu mai mult de un job, bash-ul raporteaza o
eroare. Simbolurile %% su=i %+ se refera la notiunea shell-ului de
job curent, care este ultimul job ce a fost stopat pe cind era in
foreground. Jobul precedent poate fi referit ca %-. In iesirile care
se refera la job-uri (adica in iesirile comenzii "jobs"), job-ul
curent este marcat totdeauna cu un +, iar jobulprecedent cu un -.
Simpla numire a unui job poate fi folosita pentru a-l aduce in prim-
plan (in foreground): %1 este sinonim cu ``fg %1'', aducind jobul 1
din background in foreground. In mod similar, ``%1 &'' continua jobul
1 in background, fiind echivalent cu ``bg %1''.
Shell-ul afla imediat cind un job isi schimba starea. In mod normal,
bash-ul asteapta pina cind urmeaza sa afiseze un prompt, pentru a
raporta schimbarile din starea unui job, astfel incit sa nu intrerupa
alta iesire. Daca este setata optiunea -b a comenzii interne "set",
bash-ul raporteaza imediat asemenea schimbari. (Vezi si descrierea
variabilei "notify" mai sus, la Variabile de Shell.)
Daca incerci sa iesi din bash in timp ce exista job-uri stopate,
shell-ul afiseaza un mesaj de avertizare. Poti folosi apoi comanda
"jobs" pentru a le inspecta starea. Daca faci asta, sau daca incerci
imediat sa iesi iarasi, nu mai esti avertizat si job-urile stopate
sunt terminate.
Job-urile sincrone lansate de bash au semnale setate la valorile
mostenite de shell de la parintele lui. Cind controlul job-urilor nu
este in functiune, job-urile din background (cele lansate cu &)
ignora SIGINT si SIGQUIT. Comenzile lansate ca rezultat al
substituirii de comenzi ignora semnalele de control al job-urilor
generate de tastatura: SIGTTIN, SIGTTOU si SIGTSTP.
Daca numele comenzii nu contine slash-uri, shell-ul incearca sa o
localizeze. Daca exista o functie de shell cu acel nume, acea functie
este invocata dupa cum este descris mai sus la FUNCTII. Daca numele nu
corespunde unei functii, shell-ul il cauta in lista comenzilor sale
interne. Daca este identificata in lista, acea comanda interna este
invocata.
Daca numele comenzii nu reprezinta nici o functie de shell si nici o
comanda interna, si nu contine slash-uri, bash-ul cauta in fiecare
element al variabilei PATH un director continind un fisier executabil
cu acel nume. Daca aceasta cautare esueaza, shell-ul afiseaza un mesaj
de eroare si intoarce o stare de iesire diferita de zero.
Daca are succes cautarea, sau daca numele comenzii contine unul sau
mai multe slash-uri, shell-ul executa programul respectiv. Argumentul
0 este setat la numele dat, iar urmatoarele argumente ale comenzii
sunt setate la argumentele date, daca acestea exista.
Daca aceasta executie esueaza din cauza ca fisierul nu este in format
executabil, si nu este nici un director, se presupune ca este vorba de
un script de shell, un fisier care contine comenzi de shell. Atunci
este generat un subshell pentru a-l executa. Acest subshell se
reinitializeaza el insusi, ca si cum ar fi fost invocat un nou shell
pentru a trata script-ul, cu deosebirea ca locatiile comenzilor, asa
cum si le aminteste procesul parinte (vezi "hash" mai jos, la COMENZI
INTERNE DE SHELL) sunt pastrate si de fiu.
Daca programul este un fisier care incepe cu #!, atunci restul primei
linii specifica un interpretor pentru program. Shell-ul executa
interpretorul specificat pe sisteme de operare care nu pot folosi
acest format executabil. Argumentele interpretorului constau intr-un
singur argument optional, urmind dupa numele interpretorului in prima
linie a programului, si urmat de numele programului si apoi de
argumentele comenzii, daca exista argumente.
Shell-ul iti permite sa manevrezi mediul in mai multe moduri. La
apelare, shell-ul verifica propriul sau mediu si creeaza un parametru
pentru fiecare nume gasit, marcindu-l automat pentru a-l exporta
proceselor-fiu. Comenzile executate mostenesc mediul. Comenzile
"export" si "declare -x" permit adaugarea si stergerea parametrilor si
functiilor din mediu. Daca valoarea unui parametru din mediu este
modificata, noua valoare devine parte a mediului, inlocuind-o pe cea
veche. Mediul mostenit de orice comenzi executate consta in mediul
initial al shell-ului, ale carui valori pot fi modificate in shell,
minus perechile inlaturate de comanda "unset", si plus orice adaugiri
facute prin comenzile "export" si "declare -x"
Mediul oricarei comenzi simple sau functii poate fi marit temporar
prin prefixarea lui cu atribuiri de parametri, asa cum se descrie mai
sus la PARAMETRI. Aceste instructiuni de atribuire afecteaza numai
mediul vazut de comanda respectiva.
Daca flagul -k este setat (vezi mai jos comanda interna "set"), atunci
toate atribuirile de parametri sunt plasate in mediu pentru comanda,
si nu numai acelea care preceda numele comenzii.
Cind bash-ul invoca o comanda externa, variabila _ este setata la
numele caii de acces complete a comenzii si este trecuta acelei
comenzi in mediul sau.
Daca o comanda nu este gasita, procesul-fiu creat pentru a o executa
intoarce starea de iesire 127. Daca o comanda este gasita dar nu este
executabila, starea intoarsa este 126.
Bash-ul insusi intoarce starea de iesire a ultimei comenzi executate,
in afara de cazul unei erori de sintaxa, caz cind el iese cu o valoare
non-zero. Vezi mai jos si comanda interna "exit".
In aceasta sectiune, pentru a denumi combinatiile de taste se
foloseste notatia de tip emacs. Tastele de Control sunt desemnate
prin tasta C-, de ex. C-n inseamna Control-N. In mod similar, meta-
tastele sunt denumite M-, astfel incit M-x inseamna Meta-X. (Pe
tastaturile fara tasta Meta, M-x inseamna ESC x, adica se apasa tasta
Escape si apoi tasta x. Aceasta face ca ESC sa fie meta-prefix.
Combinatia M-C-x inseamna ESC-Control-x, sau se apasa tasta Escape si
apoi, tinind apasata tasta Control, se apasa tasta x).
Asignarile de taste implicite pot fi schimbate cu un fisier
~/.inputrc. Valoarea variabilei de shell INPUTRC, daca este setata,
este folosita in locul fisierului ~/.inputrc. Celelalte programe care
folosesc aceasta biblioteca isi pot adauga propriile lor comenzi si
asignari de taste.
De exemplu, punind
Sunt recunoscute urmatoarele nume simbolice de caractere:
RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE, si TAB.
Pe linga numele de comenzi, readline permite asocierea combinatiilor
de taste cu un sur de caractere care este inserat atunci cind este
apasata combinatia de taste (un macro).
Readline este configurata punind comenzi intr-un fisier de
initializare. Numele acestui fisier este luat din valoarea variabilei
INPUTRC. Daca aceasta variabila nu este setata, fisierul implicit e
~/.inputrc. Cind este pornit un program care foloseste biblioteca
readline, fisierul de initializare este citit si sunt setate
asignarile de taste si variabilele. Exista doar citeva structuri de
baza care sunt permise in fisierul de initializare pentru readline.
Rindurile goale sunt ignorate. Rindurile care incep cu # sunt
comentarii. Rindurile care incep cu $ indica structuri conditionale.
Celelalte rinduri desemneaza asignari de taste si setari de variabile.
Sintaxa pentru controlul asignarilor de taste in fisierul ~/.inputrc
este simpla. Tot ce se cere este numele comenzii sau textul unui
macro si o combinatie de taste cu care se asociaza acestea. Numele
poate fi specificat in unul din urmatoarele 2 moduri: ca nume
simbolic de tasta, posibil cu prefixuri Meta- sau Control-, sau ca o
combinatie de taste. Cind se foloseste forma "nume-tasta:nume-functie
sau macro, nume-tasta este numele unei taste exprimate desfasurat in
engleza. De exemplu:
In a doua forma, "secv-taste":nume-functie sau macro, secv-taste
difera de nume-tasta de mai sus prin faptul ca sirurile de caractere
care desemneaza o secventa (succesiune) de taste pot fi specificate
plasind secventa intre ghilimele. Pot fi folosite unele taste de
escape de tip GNU Emacs, ca in exemplul urmator:
Iata tot setul de secvente de escape:
Bash-ul pernite afisarea sau modificarea asignarilor curente de taste
pentru biblioteca readline cu ajutorul comenzii interne "bind". Modul
de editare poate fi comutat in timpul sesiunii interactive prin
folosirea optiunii -o in comanda interna "set" Vezi mai jos COMENZI
INTERNE DE SHELL).
Biblioteca readline are variabile care pot fi folosite pentru a-i
modela ulterior comportarea. O variabila poate fi setata in fisierul
.inputrc cu o instructiune de forma:
Cind o comanda e descrisa ca eliminind ("kill") text, textul sters
este salvat pentru o eventuala recuperare ulterioara ("yanking").
Textul eliminat este salvat intr-un asa-numit "kill-ring".
Eliminarile de text succesive determina acumularea de text in acest
"kill-ring", text care poate fi recuperat tot deodata. Comenzile
care nu "ucid" ("kill") text separa buxcatile de text in zona numita
"kill-ring".
Urmeaza o lista cu numele comenzilor si cu secventele implicite de
taste care le sunt asociate.
Comenzi pentru deplasarea cursorului
Comenzi pentru manipularea istoricului
Comenzi pentru modificarea textului
Stergere [Killing] si Lipire [Yanking]
Argumente Numerice
Completare
Macroinstructiuni introduse de la tastatura
Diverse
Expandarea de istoric este realizata imediat dupa ce este citita o
linie completa, inainte ca shell-ul sa o desfaca in cuvinte. Are loc
in doua parti. Prima determina ce linie din istoricul precedent
trebuie folosita pentru substituire. A doua selecteaza portiunile din
acea linie pe care le va include in linia curenta. Linia selectata
din istoricul precedent este evenimentul cautat, iar portiunile din
ea asupra carora se actioneaza sunt cuvinte. Linia este desfacuta in
cuvinte in acelasi fel ca la citirea intrarii, astfel incit acele
cuvinte delimitate prin metacaractere si intre ghilimele sunt
considerate ca un singur cuvint. Numai backslash-ul (\) si
apostroafele (') pot cita caracterul de escape al istoricului, care
in mod implicit este !.
Shell-ul permite controlul diferitelor caractere folosite pentru
mecanismul expandarii de istoric (vezi descrierea variabilei
histchars mai sus, la VARIABILE DE SHELL).
Constantele cu 0 la inceput sunt interpretate ca numere octale. Un
0x sau 0X denota un numar hexazecimal. Altfel, numerele iau forma
[baza#]n, unde `baza' este un numar zecimal intre 2 si 36,
reprezentind baza aritmetica, iar n este un numar scris in acea baza.
Daca `baza' lipseste, atunci se foloseste baza 10.
Operatorii sunt evaluati in ordinea prioritatii. Subexpresiile dintre
paranteze sunt evaluate primele, si pot incalca regulile de
prioritate descrise mai sus.
Flagul -n suprima numerele comenzilor la listare. Flagul -r
inverseaza ordinea comenzilor. Daca este dat flagul -l, atunci
comenzile sunt listate la iesirea standard. Altfel, editorul
dat prin "enume" este invocat ca sa lucreze pe un fisier care
contine aceste comenzi. Daca "enume" lipseste, se foloseste
valoarea variabilei FCEDIT, sau valoarea variabilei EDITOR
daca FCEDIT nu este setata. Daca nici una dintre variabile nu
este setata, se foloseste editorul vi. Cind editarea a fost
incheiata, comenzile editate sunt afisate si executate.
In a doua forma, comanda este re-executata de fiecare data
cind "model" este inlocuit cu "subs". Un alias util pentru asa
ceva este "r=fc -s", astfel incit comanda "r cc" executa cea
mai recenta comanda care incepe cu "cc", iar comanda "r"
re-executa ultima comanda.
Daca se foloseste prima forma, valoarea returnata este 0 in
afara de cazul cind se intilneste o optiune ilegala sau cind
"prima" sau "ultima" desemneaza rinduri din istoric care ies
din numarul liniilor existente. Daca se da optiunea -e,
valoarea returnata este valoarea ultimei comenzi executate,
sau un cod de esec daca s-a produs vreo eroare cu fisierul
temporar de comenzi. Daca se utilizeaza a doua forma, starea
de iesire este cea a ultimei comenzi re-executate, in afara de
cazul cind "cmd" nu specifica un numar valid de linie din
istoric, cind se returneaza esec.
Comanda "getopts" raporteaza erorile in doua feluri. Daca
primul caracter din optstring este :, se foloseste raportarea
silentioasa a erorilor. In operarea normala, mesajele de
diagnostic sunt afisate cind sunt intilnite optiuni ilegale
sau absenta argumentelor optiunii. Daca variabila OPTERR este
setata la 0, nu vor fi afisate mesaje de eroare, chiar si daca
primul caracter din optstring nu este :.
Daca este gasita o optiune ilegala, "getopts" plaseaza un ? in
"nume" si, daca nu e activa raportarea silentioasa a erorii,
afiseaza un mesaj de eroare si deseteaza variabila OPTARG.
Daca "getopts" este silentios, caracterul gasit ca optiune e
plasat in OPTARG si nu se afiseaza mesaj de diagnostic.
Daca un argument necesar nu este gasit, si "getopts" nu este
silentios, un semn de intrebare (?) este plasat in "nume",
OPTARG este desetata, si se afiseaza un mesaj de diagnostic.
Daca "getopts" este silentios, atunci simbolul doua-puncte (:)
este plasat in "nume", iar OPTARG este setata la caracterul
gasit ca optiune.
Comanda "getopts" scaneaza, de regula, parametrii pozitionali,
dar daca in "args" se dau mai multe argumente, atunci ii va
scana pe acestia in loc. Comanda intoarce valoarea "true"
daca o optiune, specificata sau nespecificata, este gasita.
Ea returneaza "false" daca se intilneste sfirsitul optiunilor
sau daca survine o eroare.
Daca se da optiunea -x, comanda "jobs" inlocuieste orice
"jobspec" gasit in "comanda" sau "args" cu PID-ul care ii
corespunde, si executa "comanda" trecindu-i argumentele "args"
si returnind starea ei de iesire.
Un shell interactiv este un shell pentru care intrarea si iesirea
standard sunt conectate, amindoua, la terminale (determinate prin
"isatty(3)") sau un shell lansat cu optiunea -i. PS1 este setat si
$- include i daca bash-ul este interactiv, permitind ca un script de
shell sau ca un fisier de pornire sa-i testeze starea.
Cind bash-ul este lansat in modul Posix, ca atunci cind se da optiunea
-posix in linia de comanda, el urmeaza standardul Posix pentru fisiere
de pornire. In acest mod, variabila ENV este expandata si fisierul
desemnat de ea este executat; nici un alt fisier de pornire nu mai
este citit.
Odata ce ai stabilit ca eroarea exista cu adevarat, foloseste comanda
"bashbug" ca sa trimiti un raport de eroare. Daca ai si o rezolvare
pentru eroarea gasita, esti binevenit sa o trimiti si pe ea!
Sugestiile si raportarile "filozofice" de erori pot fi trimise prin
e-mail la bug-bash@prep.ai.MIT.Edu sau publicate in grupul de stiri
gnu.bash.bug din Usenet.
TOATE rapoartele de eroare trebuie sa includa:
Comentariile si raportarile de erori privind aceasta pagina de manual
vor fi trimise la: chet@ins.CWRU.Edu.
ERORI:
Este prea mare si prea lent.
Exista citeva diferente subtile intre bash si versiunile traditionale
de sh, majoritatea din cauza specificatiei POSIX.
Alias-urile provoaca unele confuzii in anumite cazuri.
| Comenzi simple | Pipelines | Liste | Comenzi compuse | Comentarii | Citarea | Parametri |
PARAMETRI
Exista parametri pozitionali si parametri
speciali.
nume=[valoare]
Daca valoarea lipseste, variabilei ii este atribuit sirul nul ca
valoare. Toate valorile suporta expandare prin tilda (~), expandare de
parametri si variabile, substituire de comenzi, expandare aritmetica,
si stergerea citarii. Daca variabila are setat atributul -i (vezi mai
jos comanda "declare", in COMENZI INTERNE ALE SHELL-ULUI) atunci
valoarea este supusa expandarii aritmetice, chiar daca nu apare
sintaxa $[...]. Este realizata spargerea cuvintelor ["word splitting"]
cu exceptia cazului "$@", asa cum se explica in "Parametri Speciali".
Expandarea numelui de cale nu este efectuata.
Parametri pozitionali
Un parametru pozitional este un parametru desemnat de una sau mai
multe cifre, diferite de simpla cifra 0. Parametrilor pozitionali li
se atribuie valori dupa argumentele shell-ului, cind acesta este
invocat, si li se pot atribui valori noi prin comanda interna de shell
"set". Este posibil ca parametrilor pozitionali sa nu li se atribuie
valori prin instructiuni de atribuire. Ei sunt inlocuiti temporar cind
este executata o functie de shell (vezi si FUNCTII).
Parametri Speciali
Shell-ul trateaza in mod special anumiti parametri. Acesti parametri
pot fi doar referiti; nu este permis sa li se atribuie valori.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
Variabile de Shell
Urmatoarele variabile sunt setate de catre shell:
Urmatoarele variabile sunt folosite de shell. In unele cazuri, bash
atribuie unei variabile o valoare implicita; aceste cazuri nu sunt
specificate mai jos.
MAILPATH='/usr/spool/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
Bash asigura acestei variabile o valoare implicita, dar locatia pe care
o foloseste pentru fisierele de mesaje ale utilizatorului este dependenta de
sistem (de pilda, /usr/spool/mail/$USER).
HISTCONTROL
HOSTFILE
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
EXPANDAREA
Expandarea e realizata pe linia de comanda, dupa ce aceasta a fost impartita
in cuvinte. Exista 7 tipuri de expandare: expandare de
paranteze, expandare de tilda, expandare
de parametri si variabile, substituire de comenzi,
expandare aritmetica, impartire in
cuvinte si expandarea caii de acces.
Expandarea de Paranteze
Este un mecanism prin care pot fi generate siruri arbitrare de
caractere. Acest mecanism e similar cu expandarea numelui de cale de
acces, dar numele de fisiere generate nu trebuie neaparat sa existe.
Structurile care trebuie sa suporte expandarea de paranteze iau forma
unui preambul optional, urmat de o serie de siruri despartite prin
virgule, intre o pereche de paranteze, urmate de un post-ambul
optional. Preambulul este atasat inaintea fiecarui sir dintre
paranteze, iar post-ambulul este apoi atasat la finele fiecarui sir
rezultat, expandarea facindu-se de la stinga la dreapta.
Expandarea de tilda
Daca un cuvint incepe cu un caracter tilda (`~'), toate caracterele
dinaintea primului slash (sau toate caracterele, daca nu exista nici
un slash) sunt tratate ca un posibil nume de login (nume de cont).
Daca acest nume de login este un sir nul, tilda este inlocuita cu
valoarea parametrului HOME. Daca HOME nu este setat, este pus in
locul tildei directorul home al utilizatorului care executa shell-ul.
Expandarea Parametrilor
Caracterul `$' introduce expandarea parametrilor, substituirea de
comenzi sau expandarea aritmetica. Numele sau simbolul parametrului
care trebuie expandat poate fi cuprins intre paranteze, care sunt
optionale dar slujesc la protejarea variabilei de expandat, de
caracterul imediat urmator, care ar putea fi interpretat ca facind
parte din nume.
In fiecare dintre cazurile de mai jos, cuvintul este supus expandarii
de tilda, expandarii de parametru, substituirii de comanda si
expandarii aritmetice. Bash-ul verifica daca parametrul este nesetat
sau nul; omiterea semnului `:' face sa se verifice numai daca
parametrul este nesetat.
${parametru##cuvint}
${parametru%%cuvint}
Substituirea de comenzi
Substituirea de comenzi permite ca iesirea unei comenzi sa inlocuiasca
numele comenzii. Exista doua forme:
Expandarea aritmetica
Expandarea aritmetica permite evaluarea unei expresii aritmetice si
substituirea ei cu rezultatul. Exista doua formate pentru expandarea
aritmetica:
$[expresie]
$((expresie))
Expresia e tratata ca si cum ar fi intre ghilimele, dar o ghilimea
aflata intre paranteze nu va fi tratata special. Toate elementele
din expresie suporta expandarea de parametri, substituirea de comenzi
si inlaturarea semnelor de citare. Substituirile aritmetice pot fi
cuprinse unele in altele.
Substituirea de procese
Substituirea de procese e permisa pe sisteme care suporta pipe-uri
denumite (FIFO-uri) sau metoda /dev/fd de denumire a fisierelor
deschise. Ea ia forma <(lista) sau >(lista). Lista de procese este
executata cu intrarea sau iesirea conectata la o FIFO sau la un
fisier din /dev/fd. Numele acestui fisier este trecut, ca argument,
comenzii curente, ca rezultat al expandarii. Daca se foloseste forma
>(lista), scrierea in fisier va asigura intrarea pentru lista. Daca se
foloseste forma <(lista), fisierul trecut ca argument va trebui sa fie
citit pentru a obtine iesirea listei.
Separarea cuvintelor
Shell-ul scaneaza rezultatele expandarii de parametri, substituirii
de comenzi si expandarii aritmetice care nu au fost in ghilimele,
pentru separarea cuvintelor.
Expandarea numelui caii de acces
Dupa separarea in cuvinte, in afara de cazul cind a fost setata
optiunea -f, bash-ul scaneaza fiecare cuvint pentru caracterele *, ?
si [. Daca apare unul dintre aceste caractere, atunci cuvintul este
tratat ca tipar, si este inlocuit cu o lista, sortata in ordine
alfabetica, de cai de acces care corespund tiparului. Daca nu sunt
gasite cai de acces care sa se potriveasca tiparului, si variabila de
shell allow_null_glob_expansion este nesetata, atunci cuvintul e lasat
neschimbat. Daca variabila e setata si nu se gasesc corespondente cu
tiparul, cuvintul este sters. Cind se foloseste un tipar pentru
generarea numelor de cai de acces, caracterul ``.'' de la inceputul
unui nume sau urmind imediat dupa un slash trebuie sa fie regasit in
mod explicit, cu exceptia cazului cind variabila glob_dot_filenames
este setata. Caracterul slash trebuie intotdeauna sa fie regasit in
mod explicit. In celelalte cazuri, caracterul ``.'' nu este tratat in
mod special.
Inlaturarea semnelor citarii
Dupa expandarile precedente, toate aparitiile necitate ale
caracterelor \, ` si " sunt inlaturate.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
REDIRECTIONAREA
| Redirectionarea Intrarii | Redirectionarea
Iesirii | Iesirea Redirectionata cu Adaugare | Redirectionarea Intrarii Standard si a Erorii Standard | Redirectionarea tip Document Prezent | Duplicate ale descriptorilor de fisiere | Deschiderea descriptorilor de fisiere pentru citire/scriere |
ls > dirlist 2>&1
directioneaza iesirea standard si eroarea standard catre fisierul
dirlist, in timp ce comanda:
ls 2>&1 > dirlist
directioneaza numai iesirea standard spre fisierul dirlist, deoarece
eroarea standard a fost copiata ca iesire standard inainte ca iesirea
standard sa fie redirectionata spre fisierul dirlist.
Redirectionarea Intrarii
Redirectionarea intrarii face ca fisierul al carui nume rezulta din
expandarea cuvintului sa fie deschis pentru citire cu numarul n, sau
va fi folosita intrarea standard (descriptor de fisier 0) daca n nu e
specificat.
[n]&<;cuvint
Redirectionarea Iesirii
Redirectionarea iesirii face ca fisierul al carui nume rezulta din
expandarea cuvintului sa fie deschis pentru scriere cu numarul n,
sau va fi folosita iesirea standard (descriptor de fisier 1) daca n
nu e specificat. Daca fisierul nu exista, el este creat; daca exista,
este redus la lungimea zero.
[n]>cuvint
Daca operatorul de redirectionare este >|, atunci valoarea optiunii
-C a comenzii interne set nu e testata, si se incearca sa se creeze
fisierul. (Vezi si descrierea variabilei "noclobber" mai sus, la
Variabile de Shell.
Iesirea Redirectionata cu Adaugare
Redirectionarea iesirii in acest mod face ca fisierul al carui nume
rezulta din expandarea cuvintului sa fie deschis pentru adaugare
(se scrie in el in continuare, la sfirsitul lui) cu numarul n, sau se
foloseste iesirea standard (descriptor de fisier 1) daca n nu e
specificat. Daca fisierul nu exista, el este creat.
[n]>>cuvint
Redirectionarea Iesirii Standard si a Erorii Standard
Bash-ul permite ca atit iesirea standard (descriptor de fisier 1) cit
si eroarea standard (descriptor de fisier 2) sa fie redirectionate
catre fisierul al carui nume rezulta din expandarea cuvintului.
>cuvint 2>&1
Redirectionarea tip Document Prezent
Acest tip de redirectionare programeaza shell-ul ca sa citeasca
intrarea din sursa curenta pina cind apare un rind care contine doar
cuvintul (fara spatii dupa el). Toate rindurile citite pina in acest
punct vor fi folosite apoi ca intrare standard pentru o comanda.
<<[-]cuvint
document-prezent
delimitator
Asupra cuvintului nu se efectueaza nici o expandare de parametri,
substituire de comenzi, expandare de cale de acces su expandare
aritmetica.
Duplicate ale Descriptorilor de Fisiere
Operatorul de redirectionare
[n]<&cuvint
e folosit pentru a face un duplicat al descriptorilor fisierelor de
intrare. Daca cuvintul se expandeaza la una sau mai multe cifre,
descriptorul de fisier desemnat de cifra n devine o copie a acelui
descriptor de fisier. Daca cuvintul este evaluat la -, descriptorul de
fisier n este inchis. Daca n nu e specificat, este folosita intrarea
standard (descriptor de fisier 0).
[n]>&cuvint
e folosit in mod similar pentru a face duplicat al descriptorilor de
fisiere de iesire. Daca n nu e specificat, se foloseste iesirea
standard (descriptor de fisier 0). Ca un caz special, daca n e omis
iar cuvintul nu se expandeaza la una sau mai multe cifre, iesirea si
eroarea standard sunt redirectionate cum s-a descris mai sus.
Deschiderea Descriptorilor de Fisiere pentru Citire si Scriere
Operatorul de redirectionare
[n]<>cuvint
face ca fisierul al carui nume este expandarea cuvintului sa fie
deschis atit pentru citire, cit si pentru scriere, cu descriptorul de
fisier n, sau ca intrare standard si iesire standard daca n nu este
specificat. Daca fisierul nu exista, el este creat.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
FUNCTII
O functie de shell, definita asa cum se descrie mai sus, la GRAMATICA
SHELL-ULUI, stocheaza o serie de comenzi pentru executie ulterioara.
Functiile sunt executate in contextul shell-ului curent; nu e creat
nici un proces nou ca sa le interpreteze (spre deosebire de executia
unui script de shell). Cind este executata o functie, argumentele ei
devin parametri pozitionali pe durata executiei sale. Parametrul
special # este actualizat ca sa reflecte modificarea. Parametrul
pozitional 0 ramine neschimbat.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
ALIAS-URI
Shell-ul pastreaza o lista de alias-uri (sinonime) care pot fi setate
si desetate cu comenzile interne "alias" si "unalias" (vezi mai jos
COMENZILE INTERNE DE SHELL). Primul cuvint al unei comenzi, daca nu
e citat, e verificat daca nu are un alias. Daca are, acel text e
inlocuit cu textul alias-ului. Numele alias-ului si textul pentru
inlocuire pot contine orice intrare de shell valida, inclusiv
metacaracterele listate mai sus, cu exceptia ca numele alias-ului nu
poate contine semnul =. Primul cuvint al textului cu care se face
inlocuirea este verificat daca nu contine alias-uri, dar un cuvint
identic cu un alias deja expandat nu mai e expandat a doua oara. Asta
inseamna ca se poate asocia comanda "ls" cu "ls -F", de exemplu, iar
bash-ul nu va incerca sa expandeze recursiv textul de pus in loc.
Daca ultimul caracter al valorii alias-ului este un blanc, atunci
cuvintul care urmeaza dupa alias va fi si el verificat pentru
expandarea de alias.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
CONTROLUL JOB-URILOR
Controlul job-urilor se refera la abilitatea de a stopa (sau de a
suspenda) in mod selectiv executia proceselor, si de a continua
(relua) executia lor mai tirziu. De regula, utilizatorul foloseste
aceasta facilitate printr-o interfata interactiva furnizata de
cooperarea dintre driver-ul terminalului de sistem si bash.
[1] 25647
indicind ca acest job este job-ul numarul 1 si ca identificatorul de
proces (PID-ul) ultimului proces din "pipeline"-ul asociat acestui
job este 25647. Toate procesele din acelasi "pipeline" fac parte din
acelasi job. Bash-ul foloseste conceptul abstract de "job" ca baza a
controlului job-urilor.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
SEMNALE
Cind bash-ul este interactiv, el ignora SIGTERM (astfel incit comanda
"kill 0" nu elimina un shell interactiv), iar SIGINT este captat si
tratat (astfel incit comanda interna "wait" poate fi intrerupta). In
toate cazurile, bash-ul ignora SIGQUIT. Daca este in functiune
controlul job-urilor,bash-ul ignora SIGTTIN, SIGTTOU si SIGTSTP.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
EXECUTIA COMENZILOR
Dupa ce o comanda a fost despartita in cuvinte, daca rezultatul este o
comanda simpla si o lista optionala de argumente, sunt intreprinse
urmatoarele actiuni:
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
MEDIUL
Cind este invocat un program, i se da un tablou de string-uri denumit
mediu ("environment"). Aceasta e o lista de perechi nume-valoare, de
forma nume=valoare.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
STAREA DE IESIRE
Pentru scopurile shell-ului, o comanda care iese din executie cu
starea de iesire zero este considerata reusita. O stare de iesire
diferita de zero indica nereusita. Cind o comanda se incheie datorita
unui semnal fatal, bash-ul foloseste valoarea 128+semnalul ca stare de
iesire.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
AFISAREA PROMPTULUI
Cind este executat interactiv, bash-ul afiseaza promptul principal PS1
atunci cind este gata sa citeasca o comanda, si promptul secundar PS2
atunci cind are nevoie de intrari suplimentare pentru a incheia o
comanda. Bash-ul permite modificarea dupa dorinta a acestor string-uri
de prompt, prin introducerea unor caractere speciale, precedate de \,
cu semnificatiile urmatoare:
Numarul comenzii si numarul de istoric sunt, de regula, diferite:
numarul din istoric al unei comenzi este pozitia sa in lista-istoric,
care poate sa includa comenzi restaurate din fisierul-istoric (vezi
mai jos HISTORY), pe cind numarul comenzii este pozitia ei in cadrul
secventei de comenzi executate in timpul sesiunii curente de shell.
Dupa ce string-ul este decodificat, el este expandat prin expandarea
parametrilor, substituirea de comenzi, expandarea aritmetica si
despartirea cuvintelor.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
READLINE
Aceasta este biblioteca prin care se face citirea intrarii atunci
cind se foloseste un shell interactiv, in afara de cazul cind s-a dat
optiunea -nolineediting. In mod implicit, comenzile de editare a
liniei de comanda sunt similare cu cele din editorul emacs. Este
disponibila si o interfata in stilul editorului vi.
M-Control-u: universal-argument
ori
C-Meta-u: universal-argument
in fisierul ~/.inputrc va face ca la combinatia M-C-u sa se execute
comanda de citire universal-argument.
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: ">&output"
In exemplul de mai sus, combinatia C-u este asociata cu functia
universal-argument, M-DEL este asociata functiei backward-kill-word,
iar C-o este programata sa execute macroul dintre ghilimele (adica sa
insereze in linie textul dintre ghilimele).
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"
In acest exemplu, C-u e iarasi asociat functiei universal-argument.
Secventa C-x C-r este asociata functiei re-read-init-file, iar
secventa ESC [ 1 1 ~ este programata sa insereze textul dintre
ghilimele, din dreapta (Function Key 1).
Cind se introduce textul unui macro, trebuie folosite ghilimelele
simple (apostroafe) sau duble pentru a desemna definitia unui macro.
Textul necitat se presupune a fi un nume de functie. Backslash-ul va
cita orice caracter din textul macro-ului, inclusiv " si '.
set nume-variabila valoare
In afara cazurilor specificate altfel, variabilele bibliotecii
readline pot lua valorile On sau Off. Variabilele si valorile lor
implicite sunt urmatoarele:
Readline implementeaza o facilitate similara in esenta cu directivele
conditionale de compilare ale preprocesorului de C, care permite
sa se faca asignari de taste si setari de variabile in functie de
rezultatul testelor. Sunt folosite 3 directive de parser.
Comenzile bibliotecii readline pot primi argumente numerice, care
actioneaza, in mod normal, ca numarare a repetarilor. Totusi, uneori
este important semnul argumentului. Dind un argument negativ, unei
comenzi care actioneaza in directia "inainte" (de ex. kill-line)
face ca acea comanda sa actioneze indarat. Comenzile ale caror
argumente deviaza de la aceasta comportare sunt scoase in evidenta.
Bash:
$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
ISTORICUL
Cind este interactiv, shell-ul ofera accesul la istoricul comenzilor,
lista comenzilor introduse anterior. Textul lor, sau ultimele
comenzi (numarul lor este fixat prin HISTSIZE, implicit fiind 500)
se salveaza intr-o lista de istoric. Shell-ul sticheaza fiecare
comanda in lista istoric inainte de expandarea de parametri si de
variabile (vezi mai sus EXPANDAREA), dar dupa ce se efectueaza
expandarea de istoric, supusa valorilor variabilelor de shell
command_oriented_history si HISTCONTROL. La pornire, istoricul este
initializat din fisierul denumit de variabila HISTFILE (implicit
~/.bash_history). HISTFILE este trunchiat, eventual, ca sa contina
maximum HISTFILESIZE linii. Comanda interna "fc" (vezi mai jos si
COMENZILE INTERNE DE SHELL) poate fi folosita pentru a edita sau
re-executa o portiune din lista-istoric. Comanda interna "history"
poate fi folosita pentru a afisa lista istoric si pentru a manipula
fisierul istoric. Cind se face editarea liniei de comanda, sunt
disponibile, in fiecare mod de editare, comenzi de cautare care
permit accesul la lista istoric. Cind se iese din shellul interactiv,
ultimele HISTSIZE linii sunt copiate din lista istoric in fisierul
desemnat de HISTFILE. Daca HISTFILE nu e setata, sau daca fisierul
istoric nu poate fi scris, istoricul nu e salvat.
EXPANDAREA DE ISTORIC
Shell-ul suporta o expandare de istoric care e similara cu cea din
csh. Aceasta sectiune descrie sintaxa valabila. Procedura aceasta e
activa in mod implicit pentru shell-uri interactive, si poate fi
dezactivata folosind optiunea +H a comenzii interne "set" (vezi si
COMENZILE INTERNE DE SHELL, mai jos). Shell-urile non-interactive
nu realizeaza expandarea de istoric.
Semnificatori de Evenimente
Un semnificator de eveniment este o referire la o intrare (linie de
comanda) din lista istoric.
Semnificatori de Cuvinte
Un caracter `:' desparte specificatia evenimentului de semnificatorul
de cuvint. El poate fi omis daca semnificatorul de cuvint incepe cu
^, $, * sau %. Cuvintele sunt numarate de la inceputul rindului,
primul cuvint fiind notat cu 0 (zero).
Modificatori
Dupa semnificatorul de cuvint optional, poti adauga o secventa de
unul sau mai multi modificatori, fiecare fiind precedat de `:'.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
EVALUAREA ARITMETICA
Shell-ul permite evaluarea expresiilor aritmetice, in anumite
conditii (vezi comanda interna "let" si Expandarea Aritmetica).
Evaluarea se face in intregi lungi, fara verificarea depasirii, desi
impartirea prin zero este sesizata si semnalata ca eroare. Urmatorii
operatori sunt grupati pe nivele de prioritate egala. Nivelele sunt
listate in ordinea descrescatoare a prioritatii.
Variabilele de shell sunt acceptate ca operanzi; inainte de evaluarea
expresiei se realizeaza expandarea parametrilor. Valoarea unui
parametru din cadrul unei expresii este convertita la un intreg lung.
O variabila de shell nu trebuie sa aiba activat atributul integer ca
sa poata fi folosita intr-o expresie.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
COMENZILE INTERNE ALE SHELL-ULUI
: [argumente]
Fara efect; aceasta comanda nu face altceva decit expandeaza
argumentele si realizeaza redirectionarile specificate. Este
intors un cod de iesire zero.
. fisier [argumente]
source fisier [argumente]
Citeste si executa comenzi din "fisier" in mediul de shell
curent, si intoarce starea de iesire a ultimei comenzi
executate din "fisier". Daca "fisier" nu contine un slash,
atunci sunt folosite numele de cale din PATH pentru a gasi
directorul care contine fisierul. Fisierele cautate pe caile
din PATH nu trebuie sa fie executabile. Daca "fisier" nu este
gasit in PATH, atunci se cauta in directorul curent. Daca se
specifica argumente, ele devin parametri pozitionali la
executia fisierului. Altfel, parametrii pozitionali ramin
nemodificati. Starea de iesire este starea ultimei comenzi
executate din script (0 daca nu se executa nici o comanda),
si este "false" daca nu este gasit fisierul.
alias [nume[=valoare] ...]
Comanda "alias" fara argumente afiseaza la iesirea standard
lista de alias-uri in forma "nume=valoare". Cind sunt date si
argumente, se defineste un alias pentru fiecare nume caruia i
se da o valoare. Un spatiu in cuprinsul sirului "valoare"
face ca urmatorul cuvint sa fie verificat daca nu contine
alias-uri, pentru a-l substitui la expandarea alias-ului.
Pentru fiecare nume din lista de argumente, pentru care nu se
specifica o valoare, numele si valoarea alias-ului sunt
afisate. Alias-ul intoarce valoarea "true", in afara de cazul
cind se da un nume pentru care nu s-a definit nici un alias.
bg [jobspec]
Trece in background jobul desemnat prin "jobspec", ca si cind
acesta ar fi fost lansat folosind simbolul &. Daca "jobspec"
nu este prezent, este folosit job-ul curent. Comanda intoarce
0 in afara cazului cind este suspendat controlul joburilor,
sau (cu controlul joburilor activat) daca "jobspec" a fost
lansat fara controlul joburilor sau nu este gasit.
bind [-m keymap] [-lvd] [-q nume]
bind [-m keymap] -f fisier
bind [-m keymap] keyseq:nume-functie
Afiseaza asignarile curente de taste si functii pentru
biblioteca readline, sau asociaza o secventa de taste cu o
functie sau macroinstructiune din readline. Sintaxa acceptata
este identica cu cea din fisierul .inputrc, dar fiecare
asociere trebuie specificata cu un argument distinct, de ex.:
'"\C-x\C-r":re-read-init-file'.
Optiunile, daca sunt date, au urmatoarele semnificatii:
Valoarea returnata este 0, in afara de cazul cind este data o
optiune nerecunoscuta, sau cind survine o eroare.
break [n]
Iese dintr-o bucla for, until sau while. Daca n este
specificat, intrerupe n niveluri ale buclei. n trebuie sa fie
cel putin 1. Daca n este mai mare decit numarul de bucle
incluse, atunci se iese din toate buclele incluse. Valoarea
returnata este 0, in afara de cazul ca shell-ul executa o
bucla cind are loc intreruperea.
builtin comanda-interna [argumente]
Executa comanda interna specificata, tercindu-i argumentele,
si intoarce starea ei de iesire. Este utila cind vrei sa
definesti o functie al carei nume este identic cu cel al unei
comenzi interne de shell, dar in cadrul acestei functii
trebuie sa folosesti si comanda interna originala. Comanda
interna "cd" este redefinita, de obicei, in acest fel. Starea
la iesire este "false" daca comanda interna specificata nu
este o comanda interna de shell.
cd [dir]
Schimba directorul curent cu dir. Variabila HOME contine
valoarea implicita a lui dir. Variabila CDPATH defineste calea
de cautare a directorului care contine directorul dir. Numele
alternative de directoare sunt despartite prin ":". Un nume
nul de director in CDPATH este similar cu directorul curent,
specificat prin ".". Daca dir incepe cu un slash (/), atunci
nu se foloseste CDPATH. Un argument "-" este echivalent cu
$OLDPWD. Valoarea returnata este "true" daca directorul a fost
schimbat cu succes, altfel este "false".
command [-pVv] comanda [argument ...]
Executa comanda cu argumentele date, suprimind cautarea
normala a functiilor de shell. Sunt executate numai comenzile
interne si cele gasite in calea data de PATH. Daca este data
optiunea -p, cautarea comenzii se face folosind o valoare
implicita pentru PATH, care asigura gasirea utilitarelor
standard. Daca se da optiunea -v, este afisata o descriere a
comenzii. Optiunea -v produce un singur cuvint care reprezinta
comanda sau calea folosita pentru a apela afisarea comenzii;
optiunea -V produce o descriere mai detaliata. Un argument --
dezactiveaza verificarea optiunilor la restul argumentelor.
Daca se da optiunea -V sau -v, starea de iesire este 0 daca
este gasita comanda, altfel este 1. Daca nu se da nici una din
aceste optiuni si apare o eroare sau nu e gasita comanda,
atunci starea de iesire este 127. Altfel, starea de iesire
este starea de iesire a comenzii.
continue [n]
Reia executia cu urmatoarea iteratie a buclei for, while sau
until in care este inclusa. Daca n este specificat, reia de la
bucla numarul n, unde n trebuie sa fie >= 1. Daca n este mai
mare decit numarul de cicluri, este reluata executia cu
ultimaul ciclu din bucla (cel final). Valoarea returnata este
0 in afara de cazul cind shell-ul nu executa nici o bucla in
momentul executiei comenzii "continue".
declare [-frxi] [nume[=valoare]]
typeset [-frxi] [nume[=valoare]]
Declara variabile si/sau le da atribute. Daca nu se dau nume,
atunci se afiseaza valorile variabilelor. Optiunile pot fi
folosite pentru a restringe iesirea la variabilele care au
atributul specificat.
Folosirea lui `+' in loc de `-' dezactiveaza atributul. Cind
se foloseste intr-o functie, face numele sa fie local, ca si
comanda "local". Valoarea returnata este 0, in afara de cazul
cind se intilneste o optiune ilegala, cind se incearca sa se
defineasca o functie folosind "-f foo=bar", unul dintre nume
nu este un nume valid de variabila de shell, cind se incearca
dezactivarea starii "readonly" pentru o variabila "readonly",
sau cind se incearca afisarea unei functii inexistente cu -f.
dirs [-l] [+/-n]
Afiseaza lista directoarelor memorate in mod curent.
Directoarele sunt adaugate la lista prin comanda "pushd".
Comanda "popd" executa deplasarea inapoi prin lista.
Valoarea returnata este 0, in afara de cazul cind este
furnizata o optiune ilegala sau cind n depaseste capatul
stivei de directoare.
echo [-neE] [arg ...]
Scrie la iesire argumentele (arg), separate prin spatii.
Starea returnata este intotdeauna 0. Daca se specifica -n, va
fi suprimat codul
enable [-n] [-all] [nume ...]
Activeaza si dezactiveaza comenzile interne de shell. Aceasta
permite executia unei comenzi de pe disc, care are acelasi
nume ca si o comanda interna de shell, fara specificarea unei
cai complete de cautare. Daca se foloseste -n, fiecare "nume"
este dezactivat; altfel, sunt activate comenzile desemnate de
"nume". De exemplu, pentru a folosi comanda "test" gasita prin
calea din PATH in loc de versiunea ei interna, se scrie:
enable -n test
Daca nu se dau argumente, este afisata o lista a tuturor
comenzilor de shell active. Daca se da doar -n, se afiseaza o
lista a tuturor comenzilor interne dezactivate. Daca se da
doar -all, lista afisata include toate comenzile interne, cu o
indicare a starii lor de activare sau dezactivare. Se accepta
-a ca sinonim pentru -all. Valoarea returnata este 0, in afara
de cazul cind un "nume" nu reprezinta o comanda interna de
shell.
eval [arg ...]
Argumentele (arg) sunt citite si concatenate impreuna intr-o
singura comanda. Aceasta comanda este apoi citita si executata
de shell, si starea ei de iesire este returnata ca valoare a
comenzii "eval". Daca nu exista argumente, sau exista numai
argumente nule, "eval" intoarce valoarea "true".
exec [[-] comanda [argumente]]
Daca este specificata "comanda", ea inlocuieste shellul. Nu se
creeaza nici un proces nou. Argumentele devin argumentele
comenzii. Daca primul argument este -, shell-ul plaseaza o
cratima in argumentul nr. zero care este trecut comenzii. Este
ceea ce face login-ul. Daca fisierul nu poate fi executat
dintr-un motiv oarecare, un shell neinteractiv iese din
executie, in afara cazului cind exista variabila de shell
no_exit_on_failed_exec , caz in care returneaza esecul. Daca
nu este specificata comanda, orice redirectionari au efect in
shell-ul curent, si starea de iesire este 0.
exit [n]
Face ca shell-ul sa iasa din executie cu starea de iesire n.
Daca n este omis, starea de iesire este cea a ultimei comenzi
executate. O captare a variabilei EXIT este executata inainte
de terminarea shell-ului.
export [-nf] [nume[=cuvint]] ...
export -p
"Numele" furnizate sunt marcate pentru export automatic catre
mediul comenzilor executate ulterior. Daca se da optiunea -f,
"nume" se refera la functii. Daca nu se dau nume, sau daca se
da optiunea -p, este afisata o lista a tuturor "nume"-lor care
sunt exportate in acest shell. Optiunea -n face ca atributul
de exportare sa fie sters din variabilele numite. Un argument
-- dezactiveaza verificarea optiunilor pentru restul
argumentelor. Comanda "export" returneaza o stare de iesire 0,
in afara de cazul cind este intilnita o optiune ilegala, cind
unul dintre "nume" nu este un nume legal de variabila de shell,
sau cind se da optiunea -f cu un "nume" care nu este de functie.
fc [-e enume] [-nlr] [prima] [ultima]
fc -s [model=subs] [cmd]
Comanda Fix. In prima forma se selecteaza un sir de comenzi,
de la "prima" la "ultima", din lista-istoric. "Prima" si
"ultima" pot fi specificate ca un sir de caractere (pentru a
localiza cea mai recenta comanda care incepe cu acel sir) sau
ca un numar (un index al listei-istoric, unde se foloseste un
numar negativ ca diferenta fata de numarul comenzii curente).
Daca "ultima" nu se specifica, ea va fi setata pentru listare
la comanda curenta (astfel incit "fc -l -10" afiseaza ultimele
10 comenzi), iar pentru altceva, va fi setata la "prima". Daca
lipseste "prima", ea este setata la comanda precedenta, pentru
editare, si la -16 pentru listare.
fg [jobspec]
Plaseaza jobul specificat (jobspec) in foreground, si il face
job curent. Daca "jobspec" lipseste, se foloseste notiunea de
job curent a shell-ului. Valoarea returnata este cea a
comenzii plasate in foreground, sau cod de esec daca "fg" se
executa cind este dezactivat controlul joburilor, iar cind era
activat controlul joburilor, daca "jobspec" nu desemneaza un
job valid sau desemneaza un job care fusese lansat fara
controlul joburilor.
getopts optstring nume [args]
Comanda "getopts" este folosita de procedurile de shell pentru
a scana parametrii pozitionali. Sirul "optstring" contine
literele optiunilor care trebuie sa fie recunoscute; daca o
litera este urmata de : atunci este de asteptat ca optiunea sa
aiba un argument, care ar putea fi separat de aceasta prin
spatiu. La fiecare invocare, "getopts" plaseaza urmatoarea
optiune in variabila "nume" a shell-ului, initializind "nume"
daca nu exista, iar indexul urmatorului argument de procesat
il plaseaza in variabila OPTIND. OPTIND este initializat cu
valoarea 1 de fiecare data cind este invocat un shell sau un
script de shell. Cind o optiune necesita un argument,"getopts"
plaseaza acel argument in variabila OPTARG. Shell-ul nu
reseteaza automat variabila OPTIND; ea trebuie resetata manual
intre apelurile multiple ale comenzii "getopts" din cadrul
aceleiasi invocari a shell-ului, daca trebuie folosit un nou
set de parametri.
hash [-r] [nume]
Pentru fiecare "nume", se determina si se memoreaza calea
completa de cautare a comenzii. Optiunea -r face ca bash-ul sa
uite toate locatiile memorate deja. Daca nu se dau argumente,
se afiseaza informatii despre comenzile memorate. Un argument
-- dezactiveaza verificarea optiunilor pentru argumentele
ramase dupa --. Starea returnata este "true" in afara de cazul
cind un "nume" nu este gasit sau cind este furnizata o optiune
ilegala.
help [model]
Afiseaza informatii utile despre comenzile interne. Daca
"model" este specificat, comanda "help" ofera informatii in
detaliu despre toate comenzile care corespund modelului;
altfel, este afisata o lista a comenzilor interne de shell.
Starea de iesire este 0 in afara de cazul cind nici o comanda
nu corespunde modelului dat.
history [n]
history -rwan [fisier]
Fara optiuni, afiseaza lista-istoric de comenzi, cu rindurile
numerotate. Rindurile listate cu * au fost modificate. Un
argument n determina listarea doar a ultimelor n rinduri. Daca
se da un argument care nu este o optiune, el va fi folosit ca
nume al fisierului-istoric; daca nu, se foloseste valoarea
variabilei HISTFILE. Optiunile, daca sunt date, au urmatoarea
semnificatie:
Valoarea returnata este 0, in afara de cazul cind este
intilnita o optiune ilegala sau cind apare o eroare la citirea
sau scrierea fisierului-istoric.
jobs [-lnp] [ jobspec ... ]
jobs -x comanda [ args ... ]
Prima forma listeaza joburile active. Optiunea -l afiseaza si
PID-uri (identificatori de proces) pe linga informatiile
normale; optiunea -p listeaza numai PID-ul pentru liderul
grupului de procese. Optiunea -n afiseaza numai joburile care
si-au schimbat starea de la ultima schimbare anuntata. Daca se
da "jobspec", iesirea este limitata la informatiile despre
jobul respectiv. Starea de iesire este 0 daca nu se intilneste
o optiune ilegala si daca nu se da un "jobspec" ilegal.
let arg [arg ...]
Fiecare "arg" este o expresie aritmetica, ce trebuie evaluata
(vezi EVALUAREA ARITMETICA). Daca ultimul "arg" este evaluat
ca fiind 0, comanda "let" intoarce 1 la iesire; altfel,
intoarce 0.
local [nume[=valoare] ...]
Pentru fiecare argument, creeaza o variabila locala denumita
"nume", si ii atribuie valoarea "valoare". Cind comanda
"local" este folosita in interiorul unei functii, ea determina
limitarea vizibilitatii acestei variabile la functia aceasta
si la copiii ei. Fara operanzi, comanda "local" afiseaza la
iesirea standard o lista a variabilelor locale. Este o eroare
daca se foloseste "local" in afara unei functii. Starea de
iesire este 0, in afara de cazul cind comanda "local" este
folosita in afara unei functii, sau cind se da un nume ilegal.
logout
Iese din shell-ul de login.
popd [+/-n]
Sterge intrari din stiva de directoare. Fara argumente, sterge
din stiva directorul aflat in virf, si executa "cd" in noul
director aflat in virful stivei.
Daca "popd" este executata cu succes, se executa si o comanda
"dirs", si starea de iesire este 0. Comanda "popd" intoarce
"false" daca este intilnita o optiune ilegala, daca stiva de
directoare este goala, daca se specifica o intrare care nu
exista in stiva de directoare, sau daca schimbarea de director
("cd") esueaza.
pushd [dir]
pushd +/-n
Adauga un director in virful stivei de directoare, sau roteste
stiva, facind din noul virf al stivei directorul curent de
lucru. Fara argumente, schimba intre ele cele doua directoare
din virful stivei si intoarce 0, in afara de cazul cind stiva
este goala.
Daca executia comenzii "pushd" se incheie cu succes, atunci se
executa si o comanda "dirs". Daca se foloseste prima forma,
"pushd" intoarce starea 0 in afara de cazul cind esueaza
schimbarea directorului curent in "dir". Cu a doua forma, se
intoarce 0 numai in afara de cazul ca stive de directoare este
goala, este specificat un element non-existent al stivei de
directoare, sau esueaza schimbarea directorului in directorul
curent nou specificat.
pwd
Afiseaza calea absoluta catre directorul de lucru curent.
Calea afisata nu contine link-uri simbolice daca optiunea -P
a comenzii interne "set" este setata. Vezi si descrierea
variabilei "nolinks" mai sus, la Variabile de Shell). Starea
returnata este 0 in afara de cazul cind survine o eroare in
timpul citirii caii de acces catre directorul curent.
read [-r] [nume ...]
Se citeste un rind de la intrarea standard, si primul cuvint
este asociat cu primul "nume", al doilea cuvint cu al doilea
"nume" , s.a.m.d., cuvintele ramase fiind asociate ultimelor
"nume". Numai caracterele din IFS sunt recunoscute ca avind
rolul de delimitatori de cuvinte. Daca nu sunt date "nume",
rindul citit este atribuit ca valoare variabilei REPLY. Codul
returnat este 0, in afara de cazul ca este intilnit caracterul
end-of-file (sfirsit de fisier). Daca este data optiunea -r,
o pereche backslash-newline nu este ignorata, si backslash-ul
este considerat ca facind parte din rind.
readonly [-f] [nume ...]
readonly -p
"Numele" date sunt marcate ca "readonly" (pot fi doar citite)
si valorile acestor "nume" nu pot fi schimbate prin atribuiri
care ar putea surveni ulterior. Daca se da optiunea -f, sunt
marcate astfel functiile ce corespund aceslor "nume". Daca nu
se dau argumente, sau daca apare optiunea -p, se afiseaza o
lista a tuturor "numelor" marcate ca "readonly". Un argument
-- dezactiveaza verificarea optiunilor pentru restul
argumentelor. Starea returnata este 0, in afara de cazul cind
se intilneste o optiune ilegala, cind unul dintre "nume" nu e
un nume legal de variabila de shell, sau daca optiunea -f se
da cu un "nume" care nu reprezinta o functie.
return [n]
Determina o functie sa iasa din executie cu valoarea de iesire
specificata prin n. Daca n este omis, starea returnata este
cea a ultimei comenzi executate din corpul functiei. Daca se
foloseste "return" in afara unei functii, dar in timpul
executiei unui script prin comanda "." (sursa), aceasta face
ca shell-ul sa opreasca executia scriptului si sa returneze
fie valoarea n, fie starea de iesire a ultimei comenzi
executate din script, ca stare de iesire a scriptului. Daca se
foloseste "return" in afara unei functii si nu in timul
executiei unui script prin comanda ".", starea returnata este
"false".
set [--abefhkmnptuvxldCHP] [-o optiune] [arg ...]
Flag-urile sunt inactive in mod implicit, in afara de cazul
cind sunt altfel specificate. Folosirea lui + in loc de - face
ca flagurile sa fie dezactivate. Flag-urile mai pot fi
specificate si ca optiuni la invocarea shell-ului. Setul
curent de flaguri poate fi gasit in $-. Dupa procesarea
argumentelor-optiuni, cele n argumente ramase sunt tratate ca
valori pentru parametrii pozitionali si sunt atribuiti, in
ordine, parametrilor $1, $2, ..., $n. Daca nu se furnizeaza
nici un fel de optiuni sau argumente, sunt afisate toate
variabilele de shell. Starea de iesire este intotdeauna "true"
in afara de cazul cind este intilnita o optiune ilegala.
Daca nu se da nici un nume de optiune, se afiseaza
valorile optiunilor curente.
shift [n]
Parametrii pozitionali incepind cu n+1 sunt redenumiti ca $1,
$2 etc. Parametrii reprezentati de numerele $# pina la $#-n+1
sunt desetati. Daca n este 0, nici un parametru nu se schimba.
Daca n nu este dat, se presupune ca n este 1. Trebuie ca n sa
fie un numar ne-negativ, mai mic sau egal cu $#. Daca n este
mai mare decit $#, parametrii pozitionali nu sunt schimbati.
Starea returnata este mai mare ca 0 daca n este mai mare decit
$# sau daca n e mai mic decit 0; altfel, este 0.
suspend [-f]
Suspenda executia shell-ului curent pina cind primeste un
semnal SIGCONT. Optiunea -f anuleaza orice reactie daca este
vorba de un shell de login, deci il suspenda oricum. Starea de
iesire este 0 in afara de cazul cind shell-ul este un shell de
login si nu s-a dat optiunea -f, sau daca nu este activat
controlul joburilor.
test expr
[ expr ]
Intoarce starea 0 ("true") sau 1 ("false") in functie de
evaluarea expresiei conditionale "expr". Expresiile pot sa fie
unare sau binare. Expresiile unare sunt adesea folosite pentru
a examina starea unui "fisier". Exista si operatori pentru
siruri de caractere, si operatori de comparare numerica.
Fiecare operator si operand trebuie sa fie un argument
separat. Daca "fisier" este de forma /dev/fd/n, atunci este
verificat descriptorul de fisier n.
string
Acesti operatori aritmetici binari intorc valoarea
"true" daca relatia dintre "arg1" si "arg2" este cea
verificata de fiecare dintre ei.
Argumentele "arg1" si "arg2" pot fi intregi pozitivi,
intregi negativi, sau expresia speciala "-l string",
care evalueaza lungimea unui sir de caractere.
times
Afiseaza timpul acumulat de utilizator si de sistem pentru
shell-ul curent si pentru procesele executate de shell. Starea
returnata este 0.
trap [-l] [arg] [sigspec]
Argumentul "arg" al comenzii urmeaza sa fie citit si executat
cind shell-ul primeste semnalul (sau semnalele) "sigspec".
Daca "arg" este - sau lipseste, toate semnalele specificate
sunt resetate la valorile lor originale (valorile pe care le
aveau la intrarea in shell). Daca "arg" este sir nul, acest
semnal este ignorat de shell si de comenzile invocate de el.
Semnalul "sigspec" este fie un nume de semnal definit in
type [-all] [-type | -path] nume [nume ...]
Fara optiuni, indica modul in care va fi folosit fiecare
"nume" daca este folosit ca nume de comanda. Daca se foloseste
flagul -type, se afiseaza o fraza care poate fi una dintre
urmatoarele: "alias" (alias), "keyword" (cuvint rezervat de
shell), "function" (functie de shell), "builtin" (comanda
interna a shell-ului), sau "file" (fisier pe disc), in functie
de tipul lui "nume". Daca "nume" nu este gasit, atunci nu se
afiseaza nimic si se intoarce o stare de iesire "false". Daca
este folosit flagul -path, comanda "type" intoarce fie numele
fisierului de pe disc care ar fi executat daca "nume" ar fi
specificat ca nume de comanda, fie nimic daca flagul -type ar
intoarce un tip diferit de "file". Daca o comanda este marcata
(stil "hash"), -path afiseaza valoarea marcata, si nu neaparat
fisierul care apare primul in calea data de PATH. Daca este
folosit flagul -all, se afiseaza toate locurile care contin un
"nume" executabil specificat. Aceasta include alias-uri si
functii, daca si numai daca nu este folosit simultan si -path.
Tabela comenzilor marcate (cu "hash") nu este consultata cind
se foloseste -all. Comanda "type" accepta -a, -t si -p in loc
de -all, -type si -path, respectiv. Un argument -- va
dezactiva verificarea optiunilor pentru restul argumentelor.
Comanda "type" intoarce "true" daca este gasit oricare dintre
argumente, si "false" daca nu este gasit niciunul.
ulimit [-SHacdfmstpnuv [limita]]
Aceasta comanda permite operatorului sa aiba controlul asupra
resurselor disponibile pentru shell si pentru procesele
lansate de acesta, pe sistemele care permit acest control.
Valoarea limitei poate fi un numar masurat in unitatea
specificata pentru resursa, sau valoarea "unlimited".
Optiunile H si S specifica faptul ca, pentru resursa data,
este setata limita dura ("hard") sau blinda ("soft"). O limita
dura nu poate fi largita odata ce a fost setata; o limita
blinda poate fi marita pina la valoarea limitei dure. Daca nu
se specifica nici optiunea H, nici S, comanda se aplica pentru
limita blinda. Daca limita este omisa, se afiseaza valoarea
curenta a limitei blinde pentru resursa, in afara de cazul ca
se da optiunea H. Cind se specifica mai multe resurse,
inaintea valorii sunt afisate numele limitei si unitatea. Alte
optiuni sunt interpretatea stfel:
Un argument -- dezactiveaza verificarea optiunilor pentru
restul argumentelor. Daca se da limita, ea este noua valoare
pentru resursa specificata (optiunea -a face doar afisarea).
Daca nu se da nici o optiune, atunci se presupune ca este -f.
Valorile sunt in incrementi de 1024 bytes, cu exceptia lui -t,
pentru care valoarea este in secunde, -p care este masurata in
blocuri de 512 bytes, si -n si -u, care sunt valori nescalate.
Starea returnata este 0 in afara de cazul cind este intilnita
o optiune ilegala, sau cind un argument ne-numeric, altul
decit "unlimited", este dat ca limita, sau cind apare o eroare
la setarea unei limite noi.
umask [-S] [mod]
Masca pentru crearea fisierelor utilizatorului este setata la
valoarea data de "mod". Daca "mod" incepe cu o cifra, valoarea
sa este interpretata ca un numar octal; altfel este
interpretat ca masca de mod simbolic, similara cu cea
acceptata de comanda "chmod(1)". Daca "mod" este omis, sau
daca se da optiunea -S, valoarea curenta a mastii este
afisata. Optiunea -S determina afisarea mastii in forma
simbolica; iesirea implicita este un numar octal. Un argument
-- dezactiveaza verificarea optiunilor pentru argumentele
ramase. Starea returnata este 0 daca modul a fost schimbat cu
succes sau daca nu s-a dat nici un argument "mod", altfel este
"false".
unalias [-a] [nume ...]
Sterge numele din lista de alias-uri definite. Daca se da -a,
toate definitiile de alias-uri sunt sterse. Valoarea returnata
este "true" in afara de cazul cind un "nume" dat nu este un
alias definit.
unset [-fv] [nume ...]
Pentru fiecare "nume", sterge (deseteaza) variabila respectiva
sau, daca s-a dat optiunea -f, functia corespunzatoare. Un
argument -- dezactiveaza verificarea optiunilor pentru restul
de argumente. De retinut ca variabilele PATH, IFS, PPID, PS1,
PS2, UID, si EUID nu pot fi desetate. Daca una din variabilele
RANDOM, SECONDS, LINENO, ori HISTCMD este desetata, ea isi
pierde proprietatile speciale, chiar si daca ulterior este
resetata. Starea de iesire este "true" in afara de cazul cind
un "nume" nu exista sau este al unei variabile care nu poate
fi desetata.
wait [n]
Asteapta incheierea procesului specificat prin n si intoarce
starea lui de iesire. Valoarea n poate fi un PID sau o
specificatie de job; daca este un job, se asteapta incheierea
tuturor proceselor din cadrul acelui job. Daca n nu este dat,
se asteapta incheierea tuturor proceselor-fiu active in mod
curent, si starea returnata este zero. Daca n specifica un
proces sau job inexistent, starea returnata este 127. Altfel,
starea returnata este starea de iesire a ultimului proces sau
job a carui incheiere a fost asteptata.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |
INVOCAREA SHELL-ULUI
Un shell de login este un shell al carui argument zero incepe cu
caracterul -, sau un shell lansat cu flagul -login.
Daca Bash este invocat ca sh, el incearca sa mimeze cit mai fidel
comportarea lui sh. Pentru un shell de login, el incearca sa execute
numai /etc/profile si ~/.profile, in aceasta ordine. Optiunea
-noprofile inca poate fi folosita pentru a dezactiva acest
comportament. Un shell invocat ca sh nu incearca sa execute nici un
alt fisier de pornire.
daca exista /etc/profile, il executa.
daca exista ~/.bash_profile, il executa,
altfel daca exista ~/.bash_login, il executa,
altfel daca exista ~/.profile, il executa.
daca exista ~/.bash_logout, il executa.
daca exista ~/.bashrc, il executa.
daca variabila de mediu ENV este nenula, o expandeaza si executa
fisierul desemnat de ea, ca si cum s-ar executa comanda:
if [ "$ENV" ]; then . $ENV; fi
dar nu foloseste PATH ca sa caute numele caii de acces. Cind nu
este lansat in modul Posix, bash-ul cauta variabila BASH_ENV
inainte de a cauta ENV.
VEZI SI:
Bash Features, Brian Fox and Chet Ramey
The Gnu Readline Library, Brian Fox and Chet Ramey
The Gnu History Library, Brian Fox and Chet Ramey
A System V Compatible Implementation of 4.2BSD Job
Control, David Lennert
Portable Operating System Interface (POSIX) Part 2:
Shell and Utilities, IEEE
sh(1), ksh(1), csh(1)
emacs(1), vi(1)
readline(3)
FISIERE:
/bin/bash
Executabilul bash.
/etc/profile
Fisier de initializare pentru tot sistemul, executat pentru
shell-uri de login.
~/.bash_profile
Fisier personal de initializare, executat pentru shell-uri de
login.
~/.bashrc
Fisierul individual de pornire pentru shell-uri interactive
non-login.
~/.inputrc
Fisierul individual de initializare pentru "readline".
AUTORI:
Brian Fox, Free Software Foundation (autor principal)
bfox@ai.MIT.Edu
Chet Ramey, Case Western Reserve University
chet@ins.CWRU.Edu
RAPORTAREA ERORILOR
Daca descoperi o eroare de programare ("bug") in bash, este indicat
sa o anunti. Dar mai intii ar trebui sa te asiguri ca este efectiv o
eroare, si ca apare in ultima versiune de bash pe care o ai.
Numarul versiunii de bash
Hardware-ul si sistemul de operare
Compilatorul folosit pentru compilare
O descriere a comportarii erorii
Un scurt script sau "reteta" care pune in evidenta eroarea.
Comanda "bashbug" insereaza automat primii trei itemi in macheta pe
care o ofera pentru completarea unui raport de eroare.
| Optiuni | Argumente | Definitii | Cuvinte rezervate | Gramatica shell-ului | Variabile de shell |
Expandarea | Redirectionarea | Functii | Aliasuri | Controlul
joburilor | Semnale | Executia
comenzilor | Mediul | Starea de iesire
| Afisarea promptului | Biblioteca
Readline | Istoricul | Evaluarea
aritmetica | Comenzile interne de shell | Invocarea shellului |