.\" -*- coding: UTF-8 -*- .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" Generated by scdoc 1.11.4 .\" Complete documentation for this program is not available as a GNU info page .nh .ad l .\" Begin generated content: .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH RPM\-MACROS 7 "8 ianuarie 2026" "RPM 6.0.1" .PP .SH NUME rpm\-macros \- procesor macrocomenzi RPM .PP .SH SINOPSIS .SS Definirea \fB%\fP\fINUME\fP \fICORP\fP .PP \fB%\fP\fINUME\fP\fB(\fP[\fIOPȚIUNI\fP]\fB)\fP \fICORP\fP .PP .SS Expandarea \fB%\fP\fINUME\fP .PP \fB%\fP\fINUME\fP [\fIOPȚIUNI\fP] [\fIARGUMENTE\fP] .PP \fB%{\fP\fINUME\fP\fB}\fP .PP \fB%{\fP\fINUME\fP [\fIOPȚIUNI\fP] \fIARGUMENTE\fP\fB}\fP .PP \fB%{\fP\fINUME\fP\fB:\fP\fIARGUMENT\fP\fB}\fP .PP \fB%{?\&\fP\fINUME\fP\fB}\fP .PP \fB%{?\&\fP\fINUME\fP\fB:\fP\fIVALOARE\-DACĂ\-DEFINITĂ\fP\fB}\fP .PP \fB%{!\&?\&\fP\fINUME\fP\fB:\fP\fIVALOARE\-DACĂ\-NU_ ESTE\-DEFINITĂ\fP\fB}\fP .PP \fB%(\fP\fICOMANDĂ\-SHELL\fP\fB)\fP .PP \fB%[\fP\fIEXPRESIE\fP\fB]\fP .PP \fB%[\fP\fIEXPRESIE\fP \fB?\&\fP \fIVALOARE\-DACĂ\-ADEVĂRAT\fP \fB:\fP \fIVALOARE\-DACĂ\-FALS\fP\fB]\fP .PP \fB%{lua:\fP\fICOD\-LUA\fP\fB}\fP .PP .SH DESCRIERE .PP RPM are un procesor de macrocomenzi încorporat puternic. Utilizările principale ale macrocomenzilor sunt configurarea și alte funcții utilitare pentru RPM în sine, precum și ca ajutor pentru împachetare în fișierele spec.\& .PP Pe lângă simpla substituire a textului, procesorul de macrocomenzi acceptă următoarele funcții: .PD 0 .IP \(bu 4 funcție de tip \fBMACROCOMENZI PARAMETRICE\fP cu opțiuni și procesare de argumente și macrocomenzi definite de utilizator și automate cu domeniu de aplicare local .IP \(bu 4 \fBExpansiune shell\fP .IP \(bu 4 \fBExpansiune expresie\fP .IP \(bu 4 \fBExpansiune Lua\fP pentru procesarea Lua încorporată .IP \(bu 4 diverse \fBMACROCOMENZI INTEGRATE\fP pentru procesarea șirurilor de caractere și interacțiunea cu sistemul de operare .PD .PP Sintaxa pentru definirea macrocomenzilor simple este: .PP .RS 4 \fINUME\fP \fICORP\fP .PP .RE Toate spațiile albe din jurul \fICORPULUI\fP sunt eliminate.\& \fINUME\fP poate fi compus din caractere alfanumerice și din caracterul de subliniere (\fB_\fP) și trebuie să aibă cel puțin două caractere.\& Corpul este (re)extins la fiecare invocare a macrocomenzii.\& Numele macrocomenzilor și opțiunile sunt sensibile la majuscule și minuscule.\& .PP Consultați \fBMACROCOMENZI PARAMETRICE\fP pentru varianta mai avansată de macrocomenzi cu procesarea opțiunilor și argumentelor.\& .PP Macrocomenzile pot fi definite prin fișiere \fBrpm\-macrofile\fP(5) și gestionate integral cu ajutorul macrocomenzilor primitive \fB%define\fP, \fB%global\fP și \fB%undefine\fP, linia de comandă RPM descrisă în \fBrpm\-common\fP(8) și API (C, Python, Lua).\& .PP Cu excepția celor definite în macrocomenzile parametrice, macrocomenzile au întotdeauna domeniu global.\& .PP Macrocomenzile RPM sunt stivuite, adică atunci când se redefinește o macrocomandă deja existentă, aceasta acoperă definiția anterioară în loc să o înlocuiască, iar anularea definiției unei macrocomenzi elimină doar definiția de sus, activând astfel definiția macrocomenzii anterioare. .PP Rețineți că acest manual descrie doar motorul procesorului de microcomenzi în sine. Într\-un sistem normal bazat pe RPM, există un număr mare de alte microcomenzi definite prin fișiere \fBrpm\-macrofile\fP(5) care nu vor fi abordate aici.\& .PP .SH EXPANDARE Pentru a extinde o macrocomandă, plasați \fB%\fP în fața acesteia. Sunt acceptate mai multe forme: .PP \fB%\fP\fINUME\fP .RS 4 Extinde macrocomanda \fINUME\fP.\& .PP .RE \fB%{\fP\fINUME\fP\fB}\fP .RS 4 Extinde macrocomanda \fINAME\fP, permițând plasarea lângă alt text (similar cu \fB${ENV}\fP în shell).\& .PP .RE \fB%\fP\fINUME\fP [\fIOPȚIUNI\fP] [\fIARGUMENTE\fP] .RS 4 Extinde macrocomanda parametrică/încorporată \fINUME\fP, utilizând opțiunile și argumentele analizate până la sfârșitul șirului sau până la următorul caracter de linie nouă.\& .PP \fB\-\-\fP poate fi utilizat pentru a separa opțiunile de argumente.\& .PP .RE \fB%{\fP\fINUME\fP [\fIOPȚIUNI\fP] [\fIARGUMENTE\fP]\fB}\fP .RS 4 Extinde macrocomanda parametrică/încorporată \fINUME\fP, utilizând opțiunile și argumentele analizate până la închiderea \fB}\fP.\& Permite utilizarea în vecinătatea altui text.\& .PP .RE \fB%{\fP\fINUME\fP\fB:\fP\fIARGUMENT\fP\fB}\fP .RS 4 Extinde macrocomanda parametrică/încorporată \fINUME\fP, utilizând șirul de caractere după \fB:\fP ca argument unic.\& Permite utilizarea în vecinătatea altui text.\& .PP .RE Notă: Sintaxele pentru apelarea macrocomenzilor parametrice și încorporate sunt în general interschimbabile în prezent, dar înainte de versiunea 4.\&18, sintaxa \fB%{\fP\fINUME\fP\fB:\fP\fIARGUMENT\fP\fB}\fP era exclusivă pentru macrocomenzile încorporate.\& .PP Extinderea macrocomenzii poate fi evitată prin plasarea unui al doilea \fB%\fP în fața macrocomenzii, de exemplu \fB%%{nume}\fP ar fi extins la \fB%{nume}\fP.\& .PP Încercarea de a extinde o macrocomandă nedefinită se extinde la invocarea literală, de exemplu \fB%_undefined\fP se extinde la \fB%_undefined\fP. Dacă acest lucru nu este dorit, utilizați condiționale.\& .PP Expansiunile macrocomenzii pot recurge până la 64 de niveluri. .PP .SS "Expansiune shell" Extinderea shell\-ului poate fi efectuată folosind \fB%(\fP\fIcomanda shell\fP\fB)\fP.\& \fIcomanda_shell\fP este extinsă înainte de a fi executată cu \fI/bin/sh\fP, a cărei ieșire devine extinderea macrocomenzii.\& Caracterul de linie nouă de la sfârșit este șters.\& .PP Exemplu: .nf .RS 4 %(echo aa\-bb\-cc | tr \&'\-\&' \&'\&.\&') .fi .RE .PP .SS "Extindere condițională" Procesorul de macrocomenzi acceptă testarea dacă o macrocomandă este definită sau nu.\& .PP \fB%{?\&\fP\fINUME\fP\fB:\fP\fIVALOARE\fP\fB}\fP .RS 4 Se extinde la extinderea \fIVALOARE\fP dacă \fINUME\fP este definit, altfel la un șir gol.\& .PP .RE \fB%{!\&?\&\fP\fINUME\fP\fB:\fP\fIVALOARE\fP\fB}\fP .RS 4 Se extinde la extinderea \fIVALoarE\fP dacă \fINUME\fP nu este definit, altfel se extinde la un șir gol.\& .PP .RE \fB%{?\&\fP\fINUME\fP\fB}\fP .RS 4 Prescurtare pentru \fB%{?\&\fP\fINUME\fP\fB:%{\fP\fINUME\fP\fB}}\fP.\& .PP .RE Pentru teste mai complexe, utilizați \fBExpansiune expresie\fP sau \fBExpansiune Lua\fP.\& Rețineți că \fB%if\fP, \fB%ifarch\fP și altele similare nu sunt macrocomenzi, ci directive spec și pot fi utilizate numai în acel context.\& .PP Rețineți că în RPM >= 4.\&17, condițiile din macrocomenzile încorporate verifică pur și simplu existența acelei macrocomenzi încorporate, la fel ca în cazul oricărei alte macrocomenzi.\& În versiunile mai vechi, comportamentul condițiilor din macrocomenzile încorporate este nedefinit.\& .PP .SS "Expansiune expresie" Extinderea expresiei poate fi efectuată utilizând \fB%[\fP\fIEXPRESIE\fP\fB]\fP.\& O expresie este formată din termeni care pot fi combinați utilizând operatori.\& .PP RPM acceptă trei tipuri de termeni: .PD 0 .IP \(bu 4 numere formate din cifre .IP \(bu 4 șiruri de caractere între ghilimele duble (de exemplu, \fB"vreun \-șir"\fP) .IP \(bu 4 versiuni între ghilimele duble precedate de \fBv\fP (de exemplu, \fBv"3:1.\&2\-1"\fP) .PD .PP RPM va extinde macrocomenzile atunci când evaluează termenii.\& .PP Puteți utiliza operatorii standard pentru a combina termenii: .PD 0 .IP \(bu 4 operatori logici \fB&&\fP, \fB||\fP, \fB!\&\fP .IP \(bu 4 operatori relaționali \fB!\&=\fP, \fB==\fP, \fB<\fP, \fB>\fP, \fB<=\fP, \fB>=\fP .IP \(bu 4 operatori aritmetici \fB+\fP, \fB\-\fP, \fB/\fP, \fB*\fP, .IP \(bu 4 operatorul ternar \fB?\& :\fP .IP \(bu 4 paranteze .PD .PP De exemplu, \fB%[ 3 + 4 * (1 + %two) ]\fP se va extinde la \fB15\fP dacă \fB%two\fP se extinde la \fB2\fP.\& Termenii versiunii sunt comparați folosind algoritmul de comparare a versiunii RPM ([\fIepoch\fP:]\fIversion\fP[\-\fIrelease\fP]), și nu prin compararea obișnuită a șirurilor de caractere.\& .PP Rețineți că expansiunea \fB%[\fP\fIEXPRESIE\fP\fB]\fP este diferită de macrocomanda \fB%{expr:\fP\fIEXPRESIE\fP\fB}\fP.\& În cazul celei din urmă, macrocomenzile din expresie sunt mai întâi expandate, iar apoi expresia este evaluată (fără a reexpanda termenii).\& Astfel .PP .nf .RS 4 rpm \-\-define \&'foo 1 + 2\&' \-\-eval \&'%{expr:%foo}\&' .fi .RE .PP va afișa \fB3\fP.\& Utilizarea \fB%[%foo]\fP va genera eroarea "1 + 2" nu este un număr.\& .PP Efectuarea expansiunii macrocomenzii în timpul evaluării termenilor are două avantaje. În primul rând, permite RPM să efectueze o procesare corectă a scurtcircuitelor în timpul evaluării operatorilor logici. În al doilea rând, rezultatul expansiunii nu influențează analizarea expresiei, de exemplu \fB%[„%file”]\fP va funcționa chiar și dacă macrocomanda \fB%file\fP se extinde la un șir care conține ghilimele duble. .PP Adăugată: 4.\&16.\&0 .PP .SS "Expansiune Lua" Cea mai puternică dintre metodele de expansiune a macrocomenzilor este utilizarea interpretului Lua încorporat în RPM: .PP \fB%{lua:\fP\fICOD\-LUA\fP\fB}\fP .RS 4 Executați \fILUA\-CODE\fP folosind interpretul Lua încorporat în RPM, extinzându\-l la codul \fBprint()\fP și afișând rezultatul. .PP .RE Pentru detalii, consultați \fBrpm\-lua\fP(7).\& .PP .SH "MACROCOMENZI PARAMETRICE" Macrocomenzile parametrice sunt un mecanism puternic care permite crearea de macrocomenzi utilitare similare funcțiilor, cu procesare opțională și acceptarea unui număr variabil de argumente, similar instrumentelor shell obișnuite. .PP Sintaxa pentru definirea macrocomenzilor parametrice este: .PP .RS 4 \fINUME\fP([\fIOPȚIUNI\fP]) \fICORP\fP .PP .RE Dacă sunt prezente, \fIOPȚIUNILE\fP (adică șirul dintre paranteze) sunt transmise exact așa cum sunt către \fBgetopt\fP(3) pentru procesarea argc/argv la începutul invocării macrocomenzii. Sunt acceptate numai opțiunile scurte. .PP \fB\-\fP ca singurul câmp \fIOPȚIUNI\fP dezactivează procesarea opțiunilor RPM.\& Acest lucru permite macrocomenzilor să decidă în totalitate modul de gestionare a intrărilor lor, de exemplu, dacă argumentele macrocomenzii constau numai/în mare parte din elemente care încep cu \fB\-\fP, procesarea implicită nu face decât să încurce.\& .PP .SS "Macrocomenzi automate" În timpul extinderii unei macrocomenzi parametrizate, sunt disponibile următoarele macrocomenzi automate de tip shell: .PP .TS allbox;l lx l lx l lx l lx l lx l lx l lx l lx. T{ \fBMacrocomanda\fP T} T{ \fBDescriere\fP T} T{ \fB%0\fP T} T{ numele macrocomenzii care este invocată T} T{ \fB%*\fP T} T{ toate argumentele (spre deosebire de shell, fără a include niciun fanion procesat) T} T{ \fB%**\fP T} T{ toate argumentele (inclusiv orice fanioane procesate) T} T{ \fB%#\fP T} T{ numărul de argumente T} T{ \fB%{\-f}\fP T} T{ dacă este prezent la invocare, ultima apariție a fanionului \fBf\fP (fanion și argument) T} T{ \fB%{\-f*}\fP T} T{ dacă este prezent la invocare, argumentul pentru ultima apariție a fanionului \fBf\fP T} T{ \fB%1\fP, \fB%2\fP, .\&.\&.\& T} T{ argumentele în sine (după procesarea \fBgetopt\fP(3)) T} .TE .sp 1 Dacă procesarea opțiunilor încorporate a fost dezactivată cu \fB\-\fP ca câmp \fIOPȚIUNI\fP , sunt disponibile numai următoarele macrocomenzi automate: .PP .TS allbox;l lx l lx l lx l lx l lx. T{ \fBMacrocomanda\fP T} T{ \fBDescriere\fP T} T{ \fB%0\fP T} T{ numele macrocomenzii care este invocată T} T{ \fB%*\fP, \fB%**\fP T} T{ toate argumentele T} T{ \fB%#\fP T} T{ numărul de argumente T} T{ \fB%1\fP, \fB%2\fP, .\&.\&.\& T} T{ argumentele în sine T} .TE .sp 1 Macrocomenzile automate sunt definite și redefinite automat la intrarea și ieșirea din macrocomanda parametrică.\& .PP .SS "Accesarea opțiunilor" În cadrul unei macrocomenzi parametrice, există mai multe construcții care permit testarea prezenței parametrilor opționali. Cea mai simplă construcție este \fB%{\-f}\fP care se extinde (literalmente) la \fB\-f\fP dacă \fB\-f\fP a fost menționat atunci când macrocomanda a fost invocată. Există, de asemenea, prevederi pentru includerea textului dacă era prezent un fanion folosind \fB%{\-f:X}\fP.\& Această macrocomandă se extinde la (extinderea lui) \fBX\fP dacă fanionul era prezent.\& Forma negativă, \fB%{!\&\-f:Y}\fP, care se extinde la (extinderea lui) \fB Y\fP dacă \fB\-f\fP nu era prezent, este de asemenea acceptată.\& .PP .SS "Domeniul de aplicare și vizibilitatea" În general, macrocomenzile au o aplicabilitate globală, indiferent de locul și modul în care au fost definite. Cu toate acestea, macrocomenzile definite în cadrul macrocomenzilor parametrice au o aplicabilitate non\-globală, după cum urmează: .PD 0 .IP \(bu 4 macrocomenzile automate au domeniu de aplicare local, adică sunt vizibile numai la nivelul apelului macrocomenzii respective .IP \(bu 4 macrocomenzile locale definite de utilizator au un domeniu de aplicare imbricat, adică sunt vizibile la nivelul apelului macrocomenzii în sine și la niveluri mai profunde. .PD .PP Adică, o macrocomandă parametrică nu poate vedea opțiunile sau argumentele altei macrocomenzi, dar o macrocomandă locală definită de utilizator într\-o macrocomandă de apel poate fi accesată în macrocomanda (macrocomenzile) apelată (apelate).\& .PP Pentru a defini o macrocomandă globală în interiorul unei macrocomenzi parametrice, \fItrebuie\fP să utilizați \fB%global\fP în loc de \fB%define\fP.\& De asemenea, rețineți că, deoarece o astfel de macrocomandă poate face referire la alte macrocomenzi vizibile numai în domeniul curent, \fB%global\fP \fIextinde corpul macrocomenzii o singură dată în momentul definirii\fP.\& .PP .SS "Convenția de apelare" Când o macrocomandă parametrică este extinsă, se utilizează următoarea convenție de apelare: .PD 0 .IP 1. 4 orice argumente ale macrocomenzii sunt extinse la nivelul apelului destinatarului apelului .IP 2. 4 orice opțiuni pentru macrocomandă sunt procesate .IP 3. 4 macrocomenzile automate sunt configurate pentru opțiuni și argumente .IP 4. 4 corpul macrocomenzii este extins recursiv .IP 5. 4 toate macrocomenzile definite la acest nivel de apel sunt eliminate .PD .PP .SH "MACROCOMENZI INTEGRATE" RPM acceptă următoarele macrocomenzi încorporate pentru diverse operațiuni. Macrocomenzile încorporate nu pot fi redefinite sau suprascrise. .PP Notă: Stilul \fB%{name:arg}\fP este utilizat aici deoarece este cel mai compatibil cu versiunile anterioare și nu necesită citarea spațiilor albe, dar poate fi în general înlocuit și cu alte forme de expansiune.\& Funcțiile încorporate care acceptă mai multe argumente trebuie să utilizeze alte stiluri, după cum se indică mai jos.\& .PP .SS "Manipularea macrocomenzilor" Macrocomenzile primitive sunt utilizate pentru manipularea macrocomenzilor în fișierele spec și în alte macrocomenzi. Rețineți că toate acestea funcționează pe numele macrocomenzii \fIfără\fP caracterul \fB%\fP precedent. .PP \fB%define\fP \fINUME\fP[([\fIOPȚIUNI\fP])] \fICORP\fP .RS 4 Acesta este modul principal de definire a macrocomenzilor.\& A \fB%define\fP este întotdeauna complet declarativ: nu are loc nicio expansiune a macrocomenzii și nu are efecte secundare.\& Macrocomenzile definite cu acesta se află în domeniul global, cu excepția cazului în care definiția apare în interiorul unei macrocomenzi parametrice.\& .PP Exemplu: .nf .RS 4 %define ruta\-mea /usr/bin/mine .fi .RE .PP .RE \fB%global\fP \fINUME\fP[([\fIOPȚIUNI\fP])] \fICORP\fP .RS 4 Primitiva \fB%global\fP are o sintaxă identică cu \fB%define\fP, dar prezintă două diferențe comportamentale extrem de importante: după cum sugerează și numele, o macro definită cu \fB%global\fP are întotdeauna un domeniu de aplicare global, indiferent de locul în care este utilizată. .PP A doua diferență este că \fICORPUL\fP este extins o singură dată în momentul definirii, iar extinderea devine corpul macrocomenzii propriu\-zis.\& Astfel, atunci când se utilizează \fB%global\fP, pot apărea execuții de cod arbitrar și efecte secundare, în funcție de conținutul și de celelalte macrocomenzi utilizate în \fICORP\fP.\& Cea din urmă poate fi utilă pentru a evita extinderile macrocomenzii redundante și posibil costisitoare dacă valoarea nu se modifică, dar trebuie să fiți conștienți de efectele secundare. \& .PP Rețineți că, deși \fB%global\fP acceptă din punct de vedere tehnic un câmp \fIOPȚIUNI\fP, aceasta nu este potrivită pentru definirea macrocomenzilor parametrice din cauza comportamentului de expansiune al \fICORPULUI\fP. .PP Exemplu: .nf .RS 4 %global snapver 0\-0\&.48\&.20240616git .fi .RE .PP .RE \fB%undefine\fP \fINUME\fP .RS 4 Rețineți că \fB%undefine\fP doar scoate o definiție macro din stivă, astfel încât utilizarea sa nu garantează că \fINAME\fP este nedefinit după apelarea \fB%undefine\fP asupra acestuia.\& Macrocomenzile automate și macrocomenzile încorporate nu pot fi nedefinite.\& .PP Exemplu: .nf .RS 4 %undefine ruta\-mea .fi .RE .PP .RE \fB%{load:\fP\fIFIȘIER\fP\fB}\fP .RS 4 Încarcă un fișier \fBrpm\-macrofile\fP(5). (Adăugată: 4.12.0) .PP Exemplu: .nf .RS 4 %{load:/vreun/dir/macros\&.foo} .fi .RE .PP .RE .SS "Extinderea macrocomenzii" \fB%{expand:\fP\fICORP\fP\fB}\fP .RS 4 Extinde \fICORPUL\fP ca și cum ar fi un corp al unei macrocomenzi. Util pentru o indirecție sporită, cum ar fi extinderea unui nume de macrocomandă construit din două sau mai multe macrocomenzi. .PP Exemplu: .nf .RS 4 %{expand:%{foo_prefix}%{foo_suffix}} .fi .RE .PP .RE \fB%{expr:\fP\fIEXPRESIE\fP} .RS 4 Extinde \fIEXPRESIA\fP.\& Consultați \fBExtinderea expresiei\fP.\& (Adăugată în versiunea: 4.\&15.\&0) .PP Exemplu: .nf .RS 4 %{expr:5*1024} .fi .RE .PP .RE \fB%{lua:\fP\fICOD\-LUA\fP\fB}\fP .RS 4 Extinde la ieșirea \fILUA\-CODE\fP folosind interpretul Lua încorporat.\& Consultați \fBExtindere Lua\fP.\& .PP Exemplu: .nf .RS 4 %{lua:for i=65,90 do print(șir\&.char(i)) end} .fi .RE .PP .RE \fB%{macrobody:\fP\fINUME\fP\fB}\fP .RS 4 Extinde la corpul literal al macrocomenzii \fINUME\fP.\& (Adăugată în versiunea: 4.\&16.\&0) .PP Exemplu: .nf .RS 4 %{macrobody:_libdir} .fi .RE .PP .RE .SS "Operații cu șiruri de caractere" \fB%dnl\fP .RS 4 Ignoră la linia următoare (fără a extinde nimic).\& \fB%dnl\fP este metoda recomandată pentru a comenta elementele din fișierele spec, deoarece funcționează peste tot și dezactivează procesarea macrocomenzii pentru linia respectivă.\& (Adăugată în versiunea: 4.\&15.\&0) .PP Exemplu: .nf .RS 4 %dnl Acesta este un comentariu privind comportamentul %{mymacro} .fi .RE .PP .RE \fB%{gsub \fP\fIȘIR\fP, \fIMODEL\fP, \fIÎNLOCUIRE\fP [,\fIN\fP]\fB}\fP .RS 4 Înlocuiește toate aparițiile (sau primele \fIN\fP, dacă sunt specificate) ale \fIMODELULUI\fP din \fIȘIR\fP cu \fIÎNLOCUIREA\fP.\& .PP Adăugată în versiunea: 4.\&19.\&0 .PP Exemplu: .nf .RS 4 %{gsub aabbaacc aa dd 1} .fi .RE .PP .RE \fB%{len:\fP\fIȘIR\fP\fB}\fP .RS 4 Extinde la lungimea \fIȘIRULUI\fP.\& (Adăugată în versiunea: 4.\&19.\&0) .PP Exemplu: .nf .RS 4 %{len:9bf7da058a7c582878310e75be3d56a5a8b67f95} .fi .RE .PP .RE \fB%{lower:\fP\fIȘIR\fP\fB}\fP .RS 4 Extinde la litere mici \fIȘIRUL\fP.\& (Adăugată în versiunea: 4.\&19.\&0) .PP Exemplu: .nf .RS 4 %{lower:CamelCase}\&' .fi .RE .PP .RE \fB%{quote:\fP\fIȘir\fP\fB}\fP .RS 4 Citează argumentele pentru transmiterea șirurilor goale și a șirurilor cu spații albe încorporate ca argumente ale macrocomenzii parametrice. (Adăugată în versiunea: 4.\&14.\&0) .PP Exemplu: .nf .RS 4 %myzip \-x %{quote:empty spaces\&.zip} .fi .RE .PP .RE \fB%{rep \fP\fIȘIR\fP, \fIN\fP [,\fISEP\fP]\fB}\fP .RS 4 Extinde la un șir care este concatenarea a \fIN\fP copii ale \fIȘIR\fP, separate prin \fISEP\fP (dacă este specificat).\& .PP Adăugată în versiunea: 4.\&19.\&0 .PP Exemplu: .nf .RS 4 %{rep a 5} .fi .RE .PP .PP .RE \fB%{reverse:\fP\fIȘIR\fP\fB}\fP .RS 4 Inversează un șir.\& (Adăugată în versiunea: 4.\&19.\&0) .PP Exemplu: .nf .RS 4 %{reverse:tac} .fi .RE .PP .RE \fB%{shescape:\fP\fIȘIR\fP\fB}\fP .RS 4 Citează simplu \fIȘIRUL\fP cu caractere de eludare pentru utilizare în shell.\& (Adăugată în versiunea: 4.\&18.\&0) .PP Exemplu: .nf .RS 4 %{shescape:foo\&'s} .fi .RE .PP .RE \fB%{shrink:\fP\fIȘIR\fP\fB}\fP .RS 4 Elimină spațiile albe din fața și din spatele \fIȘIRULUI\fP, reduce spațiile albe intermediare la un singur spațiu.\& (Adăugată în versiunea: 4.\&14.\&0) .PP Exemplu: .nf .RS 4 %{shrink:aa bb ccc } .fi .RE .PP .RE \fB%{span:\fP\fIȘIR\fP\fB}\fP .RS 4 Șirul așa cum este, util pentru încadrarea macrocomenzilor pe mai multe linii.\& (Adăugată în versiunea: 6.\&0.\&0) .PP Exemplu: .nf .RS 4 %{span: %un lucru %un alt lucru } .fi .RE .PP .RE \fB%{sub \fP\fIȘIR\fP, \fII\fP, [,\fIJ\fP]\fB}\fP .RS 4 Extinde la subșirul din \fIȘIR\fP care începe la \fBI\fP și continuă până la \fBJ\fP.\& \fBI\fP și \fBJ\fP pot fi negative pentru a indexa de la sfârșitul șirului\&. Dacă \fBJ\fP este absent, se presupune că este egal cu \fB\-1\fP (adică sfârșitul șirului).\& .PP Adăugată în versiunea: 4.\&19.\&0 .PP Exemplu: .nf .RS 4 *%{sub fișierul\-meu\&.zip 3 6}* .fi .RE .PP .RE \fB%{upper:\fP\fIȘIR\fP\fB}\fP .RS 4 Extinde la majuscule \fIȘIRUL\fP.\& (Adăugată în versiunea: 4.\&19.\&0) .PP Exemplu: .nf .RS 4 %{upper:CamelCase}\&' .fi .RE .PP .RE .SS "Operații cu fișiere și rute" \fB%{basename:\fP\fIRUTA\fP\fB}\fP .RS 4 \fBbasename\fP(1) macrocomandă analoagă.\& .PP Exemplu: .nf .RS 4 %{nume\-bazăe:/vreun/dir/fișier\&.suf} .fi .RE .PP .RE \fB%{dirname:\fP\fIRUTA\fP\fB}\fP .RS 4 \fBdirname\fP(1) macrocomandă analoagă.\& .PP Exemplu: .nf .RS 4 %{dirname:/vreun/dir/fișier\&.suf} .fi .RE .PP .RE \fB%{exists:\fP\fIRUTA\fP\fB}\fP .RS 4 Verifică existența fișierului, expandează la 1/0.\& (Adăugată în versiunea: 4.\&18.\&0) .PP Exemplu: .nf .RS 4 %{exists:%{builddir}/myflag\&.txt} .fi .RE .PP .RE \fB%{suffix:\fP\fIRUTA\fP\fB}\fP .RS 4 Expandează partea de sufix a unui nume de fișier.\& .PP Exemplu: .nf .RS 4 %{suffix:fișierul\-meu\&.zip} .fi .RE .PP .RE \fB%{url2path:\fP\fIURL\fP\fB}\fP .RS 4 Convertește adresa URL într\-o rută locală.\& .PP Exemplu: .nf .RS 4 %{url2path:http://rpm\&.org/not/there} .fi .RE .PP .RE \fB%{uncompress:\fP\fIRUTA\fP\fB}\fP .RS 4 Extinde la o comandă pentru a afișa argumentul \fIRUTA\fP la ieșirea standard, decomprimând după cum este necesar.\& .PP Exemplu: .nf .RS 4 %{uncompress /sursa/mea\&.tar\&.gz} .fi .RE .PP .RE \fB%{xdg:\fP\fITIP\fP\fB}\fP .RS 4 Extinde la rutele directorului de bază XDG. Valorile acceptate pentru \fITIP\fP sunt: .PD 0 .IP \(bu 4 \fBcache\fP: date neesențiale specifice utilizatorului (stocate în cache) .IP \(bu 4 \fBconfig\fP: fișiere de configurare specifice utilizatorului .IP \(bu 4 \fBdata\fP: fișiere de date specifice utilizatorului .IP \(bu 4 \fBstate\fP: date de stare specifice utilizatorului .PD .PP Adăugată: 6.\&0.\&0 .PP Exemplu: .nf .RS 4 %{xdg config} .fi .RE .PP .RE .SS "Informații despre mediu" \fB%getncpus\fP .RS 4 Extinde la numărul de CPU\-uri disponibile.\& (Adăugată în versiunea: 4.\&15.\&0) .PP .RE \fB%{getncpus:\fP\fITIP\fP\fB}\fP .RS 4 Extinde la numărul de CPU\-uri disponibile, valorile acceptate pentru \fITIP\fP sunt .PD 0 .IP \(bu 4 \fBtotal\fP: numărul total de CPU\-uri disponibile (la fel ca \fB%getncpus\fP) .IP \(bu 4 \fBproc\fP: numărul de CPU\-uri disponibile pentru procese .IP \(bu 4 \fBthread\fP: numărul de CPU\-uri disponibile pentru fire de execuție .PD .PP \fBproc\fP și \fBthread\fP contabilizează memoria disponibilă, inclusiv limitările spațiului de adrese pentru firele de execuție.\& .PP Adăugată: 4.\&19.\&0.\& .PP Exemplu: .nf .RS 4 %{getncpus proc} .fi .RE .PP .RE \fB%getconfdir\fP .RS 4 Extinde la directorul „home” RPM (de obicei „/usr/lib/rpm”).\& .PP .RE \fB%{getenv:\fP\fINUME\fP\fB}\fP .RS 4 \fBgetenv\fP(1) macrocomandă analoagă.\& .PP Exemplu: .nf .RS 4 %{getenv:HOME} .fi .RE .PP .RE \fB%rpmversion\fP .RS 4 Extinde la versiunea RPM în execuție.\& .PP .RE .SS Ieșire \fB%{echo:\fP\fIȘIR\fP\fB}\fP .RS 4 Imprimă \fIȘIRUL\fP pentru a procesa ieșirea standard.\& .PP Exemplu: .nf .RS 4 %{echo:Construirea cu foo} .fi .RE .PP .RE \fB%{warn:\fP\fIȘIR\fP\fB}\fP .RS 4 Imprimă \fIȘIRUL\fP precedat de „warning: ” pentru a procesa ieșirea de eroare standard.\& .PP Exemplu: .nf .RS 4 %{warning:Foo este depreciat} .fi .RE .PP .RE \fB%{error:\fP\fIȘIR\fP\fB}\fP .RS 4 Imprimă \fIȘIRUL\fP prefixat cu „error:” pentru a procesa eroarea standard și a semnaliza o eroare în procesorul macrocomenzii.\& .PP Exemplu: .nf .RS 4 %{error:Argument nevalid} .fi .RE .PP .RE \fB%verbose\fP .RS 4 Expandează la 1/0 indiferent dacă RPM este în modul descriptiv sau nu. (Adăugată în versiunea: 4.\&17.\&1) .PP .RE \fB%{verbose:\fP\fIȘIR\fP\fB}\fP .RS 4 Extinde la \fIȘIR\fP dacă RPM este în modul descriptiv, șirul gol dacă nu este.\& (Adăugată în versiunea: 4.\&17.\&1) .PP Exemplu: .nf .RS 4 %{verbose:\-x} .fi .RE .PP .RE .SS "Macrocomenzi specifice spec" \fB%{S:\fP\fINUMĂR\fP\fB}\fP .RS 4 Extinde la numele fișierului sursei specificate \fINUMĂR\fP.\& \fB%{S:n}\fP este echivalent cu \fB%{SOURCEn}\fP.\& .PP .RE \fB%{P:\fP\fINUMĂR\fP\fB}\fP .RS 4 Extinde la numele fișierului patch\-ului specificat \fINUMĂR\fP.\& \fB%{P:n}\fP este echivalent cu \fB%{PATCHn}\fP.\& .PP .RE .SS Diagnosticare \fB%trace\fP .RS 4 Comută afișarea informațiilor de depanare înainte/după extindere. .PP .RE \fB%dump\fP .RS 4 Imprimă tabelul de macrocomenzi active (adică neacoperite). .PP .RE \fB%__nume_fișier\fP .RS 4 Extinde la numele fișierului curent (dacă se analizează un fișier).\& (Adăugată în versiunea: 4.\&15) .PP .RE \fB%__fișier_nr.linie\fP .RS 4 Extindeți la numărul liniei curente din fișierul curent (dacă se analizează un fișier).\& (Adăugată în versiunea: 4.\&15) .PP .RE .SH EXEMPLE .SS "Exemplul 1. Definiți o macrocomandă simplă" Definiți macrocomanda \fBmylib\fP ca o rută relativă la macrocomanda \fB%{_libdir}\fP într\-un fișier spec: .PP .nf .RS 4 %define mylib %{_libdir}/mine .fi .RE .PP .SS "Exemplul 2. Definiți o macrocomandă parametrică" Definiți macrocomanda parametrică \fBmyhelper\fP care execută programul specificat de \fB%myprog\fP cu primul argument al acestuia și trecând întotdeauna opțiunea \fB\-\-some\-opt\fP către acesta, precum și opțiunea \fB\-\-xtra\fP dacă a primit opțiunea \fB\-x\fP: .PP .nf .RS 4 %define myhelper(x) %{myprog} \-\-vreo\-opțiune %{?\-x:\-\-xtra} %{1} .fi .RE .PP .SS "Exemplul 3. Definiți o macrocomandă utilizând expansiunea shell\-ului" Definiți macrocomanda \fB%today\fP care se extinde la data curentă în formatul \fIAALLZZ\fP apelând ustensila shell \fBdate\fP(1).\& Rețineți că este necesară a doua macrocomandă \fB%\fP pentru a eluda argumentele către \fBdate\fP(1): .PP .nf .RS 4 %define today %(date +%%y%%m%%d) .fi .RE .PP .SS "Exemplul 4. Definiți o macrocomandă condițională" Definiți macrocomanda \fBmypath\fP dacă nu a fost definită anterior: .PP .nf .RS 4 %{!?mypath: %define mypath /vreun/loc} .fi .RE .PP .SS "Exemplul 5. Expansiune conditională" Expandează la \fB1\fP dacă \fBuse_foo\fP este definit și \fB0\fP în caz contrar: .PP .nf .RS 4 %{?use_foo:1}%{!?use_foo:0} .fi .RE .PP .SS "Exemplul 6. Expresii" Calculează 5 * 1024: .PP .nf .RS 4 %[5 * 1024] .fi .RE .PP Extinde la literalul \fBtrue\fP sau \fBfalse\fP în funcție de o condiție: .PP .nf .RS 4 %[1 < 2 ? "true" : "false"] .fi .RE .PP Compară versiunile, extinzând la \fB1\fP sau \fB0\fP pentru true/false: .PP .nf .RS 4 %[ v"3\&.1\&.0\-1" < v"1\&.0~alpha\-2" ? 1 : 0] .fi .RE .PP Expandează la \fB1\fP dacă \fB%aa\fP se extinde la \fB5\fP, altfel se extinde la \fB2\fP: .PP .nf .RS 4 %[ "%{aa}" == "5" ? 1 : 2] .fi .RE .PP .SH DEPANAREA Câteva instrumente utile pentru lucrul cu macrocomenzi și depanarea acestora: .PP \fBrpm \-\-eval "\fP\fIVALOARE\fP\fB"\fP .RS 4 Extinde \fIVALOAREA\fP în linia de comandă.\& .PP .RE \fBrpm \-\-define "aa 11" \-\-eval "%aa"\fP .RS 4 Definește și evauează o macrocomandă în linia de comandă. .PP .RE \fBrpm \-\-eval "%global unamer %(uname \-r)" \-\-eval "%{macrobody:unamer}"\fP .RS 4 Definește și examinează corpul macrocomenzii folosind \fB%global\fP în linia de comandă.\& .PP .RE \fBrpm \-\-eval "%define unamer %(uname \-r)" \-\-eval "%{macrobody:unamer}"\fP .RS 4 Definește și examinează corpul macrocomenzii folosind \fB%define\fP în linia de comandă.\& .PP .RE \fBrpmlua\fP .RS 4 Rulează un shell interactiv în mediul Lua încorporat. .PP .RE \fBrpmlua \-e '\&print(macros.\&defined("_libdir"))'\&\fP .RS 4 Folosind interpretul Lua încorporat în formă autonomă, afișează 1/0 indiferent dacă macrocomanda \fB_libdir\fP este definită sau nu.\& .PP .RE \fBrpmspec \-\-shell\fP .RS 4 Rulează un shell interactiv în mediul macrocomenzii.\& .PP .RE \fBrpmspec \-\-shell telnet.\&spec\fP .RS 4 Rulează un shell interactiv în mediul macrocomenzii după analizarea \fBtelnet.\&spec\fP.\& .PP .RE .SH "CONSULTAȚI ȘI" \fBrpm\fP(8) \fBrpm\-common\fP(8) \fBrpm\-macrofile\fP(5) \fBrpm\-config\fP(5) \fBrpm\-lua\fP(7) \fBrpmspec\fP(1) \fBrpmlua\fP(1) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .