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.
| 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