Cap. 1. Tutoriale GNU/Linux

# Cap. 1. Tutoriale GNU/Linux

Cred că învățarea unui sistem informatic este similară cu învățarea unei limbi străine. Deși manualele și documentația sunt utile, trebuie să exersați singur. Pentru a vă ajuta să începeți fără probleme, voi detalia câteva puncte de bază.

Construcția robustă a Debian GNU/Linux provine din sistemul de operare Unix, adică un sistem de operare multi-utilizator și multi-sarcină. Trebuie să învățați să profitați de forța acestor caracteristici și similitudini între Unix și GNU/Linux.

Nu vă feriti de textele orientate spre Unix și nu vă bazați exclusiv pe textele GNU/Linux, deoarece astfel veți pierde multe informații utile.

| Notă
Dacă utilizați de ceva timp un sistem de tip Unix cu instrumente de linie de comandă, probabil că știți deja tot ce explic aici. Vă rugăm să utilizați acest articol ca o verificare a realității și o reîmprospătare a cunoștințelor.

## 1.1. Noțiuni de bază despre consolă

### 1.1.1. Promptul shell

La pornirea sistemului, vi se afișează ecranul de autentificare bazat pe caractere dacă nu ați instalat niciun mediu GUI precum GNOME sau KDE. Să presupunem că numele gazdei dvs. este `foo`, promptul de autentificare arată astfel.

Dacă ați instalat un mediu GUI, puteți accesa în continuare promptul de autentificare bazat pe caractere apăsând «Ctrl-Alt-F3» și puteți reveni la mediul GUI apăsând «Ctrl-Alt-F2» (pentru mai multe informații, a se vedea Secțiune 1.1.6, „Console virtuale” mai jos).

    foo login:

La solicitarea de autentificare, introduceți numele de utilizator, de exemplu `penguin`, și apăsați tasta «Enter», apoi introduceți parola și apăsați din nou tasta «Enter».

| Notă
Conform tradiției Unix, numele de utilizator și parola sistemului Debian sunt sensibile la majuscule și minuscule. Numele de utilizator este ales de obicei numai din litere mici. Primul cont de utilizator este creat de obicei în timpul instalării. Conturi de utilizator suplimentare pot fi create cu adduser(8) de către root.

Sistemul pornește cu mesajul de salut stocat în „`/etc/motd`” („Message Of The Day” - Mesajul zilei) și afișează o linie de comandă.

    Debian GNU/Linux 12 foo tty3

    foo login: penguin
    Password:

    Linux foo 6.5.0-0.deb12.4-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.5.10-1~bpo12+1 (2023-11-23) x86_64

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    Last login: Wed Dec 20 09:39:00 JST 2023 on tty3
    foo:~$

Acum vă aflați în shell. Shell-ul interpretează comenzile dvs.

### 1.1.2. Promptul shell în GUI

Dacă ați instalat un mediu GUI în timpul instalării, la pornirea sistemului vi se va afișa ecranul grafic de autentificare. Introduceți numele de utilizator și parola pentru a vă autentifica în contul de utilizator fără privilegii. Utilizați tasta «Tab» pentru a naviga între numele de utilizator și parolă sau utilizați butonul principal al mouse-ului.

Puteți accesa promptul shell în mediul GUI pornind un program `x-terminal-emulator` precum gnome-terminal(1), rxvt(1) sau xterm(1). În mediul grafic de birou GNOME, apăsați tasta «SUPER» (tasta «Windows») și tastați „terminal” în câmpul de căutare.

În cazul altor sisteme grafice de birou (cum ar fi `fluxbox`), este posibil să nu existe un punct de pornire evident pentru meniu. Dacă se întâmplă acest lucru, încercați să faceți clic (dreapta) pe fundalul imaginii de birou și așteptați să apară un meniu.

### 1.1.3. Contul root

Contul root este denumit și super-utilizator sau utilizator privilegiat. Din acest cont, puteți efectua următoarele sarcini de administrare a sistemului.

- Citește, scrie și elimină orice fișiere din sistem, indiferent de permisiunile acestor fișiere.

- Stabilește drepturile de proprietate și permisiunile pentru orice fișier din sistem

- Stabilește parola pentru orice utilizator fără privilegii din sistem

- Se conectează la orice cont fără a introduce parola

Această putere nelimitată a contului root necesită să fiți atent și responsabil atunci când îl utilizați.

| Avertisment
Nu divulgați niciodată parola de root altor persoane.

| Notă

Permisiunile unui fișier (inclusiv dispozitive hardware precum CD-ROM etc., care sunt doar un alt fișier pentru sistemul Debian) pot face ca acesta să fie inutilizabil sau inaccesibil pentru utilizatorii care nu sunt root. Deși utilizarea contului root este o modalitate rapidă de a testa acest tip de situație, rezolvarea acesteia trebuie făcută prin stabilirea corespunzătoare a permisiunilor fișierului și a apartenenței utilizatorului la grup (a se vedea Secțiune 1.2.3, „Permisiuni ale sistemului de fișiere”).

### 1.1.4. Promptul shell-ului root

Iată câteva metode de bază pentru a obține promptul shell root utilizând parola root.

- Tastați `root` la promptul de autentificare bazat pe caractere.

- Tastați „`su -l`” din orice prompt al shell-ului utilizatorului.

  - Aceasta nu păstrează mediul utilizatorului curent.

- Tastați „`su`” din orice prompt al shell-ului utilizatorului.

  - Aceasta păstrează o parte din mediul utilizatorului curent.

### 1.1.5. Instrumente grafice de administrare a sistemului

Când meniul mediului grafic de birou nu pornește automat instrumentele de administrare a sistemului GUI cu privilegiile corespunzătoare, le puteți porni din promptul shell-ului root al emulatorului de terminal, cum ar fi gnome-terminal(1), rxvt(1) sau xterm(1). Consultați Secțiune 1.1.4, „Promptul shell-ului root” și Secțiune 7.9, „Conexiune la serverul X”.

| Avertisment
Nu porniți niciodată administratorul de afișare/sesiune cu interfață grafică sub contul root introducând `root` la promptul administratorului de afișare, cum ar fi gdm3(1). Nu rulați niciodată programe cu interfață grafică la distanță care nu sunt de încredere sub X Window atunci când sunt afișate informații critice, deoarece acestea pot intercepta ecranul X.

### 1.1.6. Console virtuale

În sistemul Debian implicit, există șase console de caractere comutabile de tip VT100 disponibile pentru a porni shell-ul de comandă direct pe gazda Linux. Cu excepția cazului în care vă aflați într-un mediu cu interfață grafică, puteți comuta între consolele virtuale apăsând simultan tasta `Alt-stânga` și una dintre tastele `F1` — `F6`. Fiecare consolă de caractere permite conectarea independentă la cont și oferă un mediu multiutilizator. Acest mediu multiutilizator este o caracteristică excelentă a Unix și foarte captivantă.

Dacă vă aflați în mediul cu interfață grafică, puteți accesa consola de caractere 3 apăsând tastele `Ctrl-Alt-F3`, adică apăsând simultan `tasta Ctrl-stânga`, tasta `Alt-stânga` și tasta `F3`. Puteți reveni la mediul cu interfață grafică, care rulează în mod normal pe consola virtuală 2, apăsând `Alt-F2`.

Alternativ, puteți trece la o altă consolă virtuală, de exemplu la consola 3, din linia de comandă.

    # chvt 3

### 1.1.7. Cum să ieșiți din promptul liniei de comandă

Tastați `Ctrl-D`, adică apăsați simultan tasta `Ctrl-stânga` și tasta `d` în linia de comandă pentru a închide activitatea shell-ului. Dacă vă aflați în consola de caractere, veți reveni la linia de autentificare. Chiar dacă aceste caractere de control sunt denumite «control D» cu majusculă, nu este necesar să apăsați tasta «Shift». Expresia prescurtată, `^D`, este utilizată de asemenea pentru `Ctrl-D`. Alternativ, puteți tasta „exit”.

Dacă vă aflați în x-terminal-emulator(1), puteți închide fereastra `x-terminal-emulator` cu această comandă.

### 1.1.8. Cum să opriți sistemul

La fel ca orice alt sistem de operare modern în care operațiile cu fișiere implică stocarea datelor în memoria cache pentru o performanță îmbunătățită, sistemul Debian necesită o procedură de oprire corespunzătoare înainte ca alimentarea să poată fi oprită în siguranță. Acest lucru are scopul de a menține integritatea fișierelor, forțând toate modificările din memorie să fie scrise pe disc. Dacă este disponibilă funcția de control al alimentării software, procedura de oprire oprește automat alimentarea sistemului. (În caz contrar, poate fi necesar să apăsați butonul de alimentare timp de câteva secunde după procedura de oprire.)

Puteți opri sistemul în modul multiutilizator normal din linia de comandă.

    # shutdown -h now

Puteți opri sistemul în modul utilizator unic din linia de comandă.

    # poweroff -i -f

Consultați Secțiune 6.3.8, „Cum să opriți sistemul de la distanță pe SSH”.

### 1.1.9. Recuperarea unei console funcționale

Când ecranul devine nebun după ce faceți unele lucruri ciudate, cum ar fi „`cat vreun-fișier-binar`”, tastați „`reset`” la promptul de comandă. Este posibil să nu puteți vedea comanda introdusă pe măsură ce o tastați. De asemenea, puteți tasta „`clear`” pentru a curăța ecranul.

### 1.1.10. Sugestii de pachete suplimentare pentru începători

Deși chiar și instalarea minimă a sistemului Debian fără niciun mediu grafic de birou oferă funcționalitatea de bază Unix, este o idee bună să instalați câteva pachete suplimentare pentru terminalul caracter bazat pe linia de comandă și curses, cum ar fi `mc` și `vim` cu apt-get(8) pentru începători, pentru a începe cu următoarele.

    # apt-get update
     ...
    # apt-get install mc vim sudo aptitude
     ...

Dacă aveți deja aceste pachete instalate, nu se instalează pachete noi.

Tabel 1.1. Lista pachetelor de programe interesante în modul text

pachet | popcon(popularitate) | dimensiune | descriere
--- | --- | --- | ---
`mc` | V:39, I:179 | 1590 | Un gestionar de fișiere în modul text pe ecran complet
`sudo` | V:756, I:867 | 6774 | Un program care permite utilizatorilor privilegii root limitate
`vim` | V:81, I:342 | 4164 | Editorul de text Unix Vi IMproved, un editor de text pentru programatori (versiunea standard)
`vim-tiny` | V:57, I:979 | 1867 | Editorul de text Unix Vi IMproved, un editor de text pentru programatori (versiunea compactă)
`emacs-nox` | V:3, I:12 | 46564 | Proiectul GNU Emacs, editorul de text extensibil bazat pe Lisp
`w3m` | V:10, I:134 | 2853 | Navigatoare web în modul text
`gpm` | V:8.2, I:9.1 | 524 | Copierea și lipirea în stil Unix în consola text (demon, simulând un mouse)

Ar fi o idee bună să citiți câteva documente informative.

Tabel 1.2. Lista pachetelor de documentație utilă

pachet | popcon(popularitate) | dimensiune | descriere
--- | --- | --- | ---
`doc-debian` | I:884 | 185 | Documentația proiectului Debian (Întrebări frecvente despre Debian) și alte documente
`debian-policy` | I:7.3 | 5147 | Manualul de politici Debian și documentele conexe
`developers-reference` | V:0.2, I:2.4 | 2647 | Ghiduri și informații pentru dezvoltatorii Debian
`debmake-doc` | I:0.37 | 11803 | Ghid pentru responsabilii cu întreținerea pachetelor Debian
`debian-history` | I:0.56 | 6513 | Istoria proiectului Debian
`debian-faq` | I:882 | 791 | Întrebări frecvente despre Debian (FAQ)

Puteți instala unele dintre aceste pachete urmând pașii de mai jos.

    # apt-get install package_name

### 1.1.11. Un cont de utilizator suplimentar

Dacă nu doriți să utilizați contul principal de utilizator pentru următoarele activități de instruire, puteți crea un cont de utilizator pentru instruire, de exemplu `fish`, urmând pașii de mai jos.

    # adduser fish

Răspundeți la toate întrebările.

Aceasta creează un cont nou numit `fish`. După ce ați exersat, puteți șterge acest cont de utilizator și directorul său principal urmând pașii de mai jos.

    # deluser --remove-home fish

În sistemele non-Debian și Debian specializate, activitățile de mai sus trebuie să utilizeze în schimb instrumentele de nivel inferior useradd(8) și userdel(8).

### 1.1.12. Configurarea «sudo»

Pentru stațiile de lucru tipice cu un singur utilizator, cum ar fi sistemul Debian cu mediu grafic de birou pe laptop, este obișnuit să se implementeze o configurație simplă a sudo(8) după cum urmează, pentru a permite utilizatorului fără privilegii, de exemplu `penguin`, să obțină privilegii administrative doar cu parola sa de utilizator, fără a fi nevoie de parola root.

    # echo "penguin  ALL=(ALL) ALL" >> /etc/sudoers

Alternativ, este de asemenea obișnuit să se procedeze după cum urmează pentru a permite utilizatorului fără privilegii, de exemplu `penguin`, să obțină privilegii administrative fără nicio parolă.

    # echo "penguin  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Această truc ar trebui folosit numai pentru stația de lucru cu un singur utilizator pe care o administrați și unde sunteți singurul utilizator.

| Avertisment
Nu configurați conturi de utilizatori obișnuiți pe stații de lucru multiutilizator de acest tip, deoarece acest lucru ar afecta grav securitatea sistemului.

| Atenție

Parola și contul `penguin` din exemplul de mai sus necesită aceeași protecție ca și parola root și contul root.

În acest context, privilegiul administrativ aparține unei persoane autorizate să îndeplinească sarcini de administrare a sistemului pe stația de lucru. Nu acordați niciodată un astfel de privilegiu unui responsabil din departamentul administrativ al companiei dvs. sau șefului dvs., cu excepția cazului în care aceștia sunt autorizați și capabili să îndeplinească astfel de sarcini.

| Notă

Pentru a acorda privilegii de acces la dispozitive și fișiere limitate, ar trebui să luați în considerare utilizarea grupului pentru a acorda acces limitat, în loc să utilizați privilegiul `root` prin intermediul sudo(8).

Cu o configurare mai atentă și mai grijulie, sudo(8) poate acorda privilegii administrative limitate altor utilizatori dintr-un sistem partajat, fără a partaja parola root. Acest lucru poate ajuta la asigurarea responsabilității în cazul gazdelor cu mai mulți administratori, astfel încât să puteți ști cine a făcut ce. Pe de altă parte, este posibil să nu doriți ca altcineva să aibă astfel de privilegii.

### 1.1.13. Ora de joacă

Acum sunteți gata să utilizați sistemul Debian fără riscuri, atâta timp cât utilizați contul de utilizator fără privilegii.

Acest lucru se datorează faptului că sistemul Debian, chiar și după instalarea implicită, este configurat cu permisiuni de fișiere adecvate, care împiedică utilizatorii fără privilegii să deterioreze sistemul. Desigur, pot exista încă unele vulnerabilități care pot fi exploatate, dar cei care sunt preocupați de aceste probleme nu ar trebui să citească această secțiune, ci ar trebui să citească Manualul de securizare Debian.

Vom învăța sistemul Debian ca un sistem de tip Unix cu ajutorul următoarelor:

- Secțiune 1.2, „Sistem de fișiere de tip Unix” (conceptul de bază)

- Secțiune 1.3, „Midnight Commander (MC)” (metoda de supraviețuire)

- Secțiune 1.4, „Mediul de lucru de bază de tip Unix” (metoda de bază)

- Secțiune 1.5, „Comanda simplă de shell” (mecanismul shell)

- Secțiune 1.6, „Procesarea textului în stilul Unix” (metoda de procesare a textului)

## 1.2. Sistem de fișiere de tip Unix

În GNU/Linux și alte sisteme de operare de tip Unix, fișierele sunt organizate în directoare. Toate fișierele și directoarele sunt aranjate într-o singură structură arborescentă cu rădăcina în „`/`”. Se numește structură arborescentă deoarece, dacă desenezi sistemul de fișiere, acesta arată ca un arbore, dar cu rădăcina în sus.

Aceste fișiere și directoare pot fi distribuite pe mai multe dispozitive. mount(8) servește la atașarea sistemului de fișiere găsit pe un dispozitiv la arborele de fișiere mare. În schimb, umount(8) îl detașează din nou. Pe nucleele Linux recente, mount(8) cu anumite opțiuni poate lega o parte a arborelui de fișiere în altă parte sau poate monta sistemul de fișiere ca fiind partajat, privat, secundar sau nelegat. Opțiunile de montare acceptate pentru fiecare sistem de fișiere sunt disponibile în „`/usr/share/doc/linux-doc-*/Documentation/filesystems/`”.

Directoarele din sistemele Unix sunt denumite dosare în alte sisteme. De asemenea, rețineți că nu există conceptul de unitate precum „`A:`” pe niciun sistem Unix. Există un singur sistem de fișiere și totul este inclus. Acesta este un avantaj enorm în comparație cu Windows.

### 1.2.1. Noțiuni de bază despre fișierele Unix

Iată câteva noțiuni de bază despre fișierele Unix.

- Numele fișierelor sunt sensibile la majuscule și minuscule. Adică, „`FIȘIERULMEU`” și „`FișierulMEU`” sunt fișiere diferite.

- Directorul rădăcină înseamnă rădăcina sistemului de fișiere, denumită simplu „`/`”. Nu confundați acest lucru cu directorul de bază al utilizatorului rădăcină: „`/root`”.

- Fiecare director are un nume care poate conține orice litere sau simboluri cu excepția „`/`”. Directorul rădăcină este o excepție; numele său este „`/`” (pronunțat „bară oblică” sau „directorul rădăcină”) și nu poate fi redenumit.

- Fiecare fișier sau director este desemnat printr-un nume de fișier complet calificat, nume de fișier absolut sau rută, indicând secvența de directoare care trebuie parcurse pentru a ajunge la acesta. Cei trei termeni sunt sinonimi.

- Toate numele de fișiere complet calificate încep cu directorul „`/`” și există o „`/`” între fiecare director sau fișier din numele fișierului. Primul „`/`” este directorul de nivel superior, iar celelalte „`/`” separă subdirectoarele succesive, până când ajungem la ultima intrare, care este numele fișierului propriu-zis. Cuvintele folosite aici pot fi confuze. Luați ca exemplu următorul nume de fișier complet calificat: „`/usr/share/keytables/us.map.gz`”. Cu toate acestea, oamenii se referă la numele său de bază „`us.map.gz`” ca fiind numele fișierului.

- Directorul rădăcină are o serie de ramuri, cum ar fi „`/etc/`” și „`/usr/`”. Aceste subdirectoare se ramifică la rândul lor în și mai multe subdirectoare, cum ar fi „`/etc/systemd/`” și „`/usr/local/`”. Ansamblul este denumit arborele de directoare. Puteți considera un nume de fișier absolut ca o rută de la baza arborelui („`/`”) până la capătul unei ramuri (un fișier). De asemenea, veți auzi oamenii vorbind despre arborele de directoare ca și cum ar fi un arborele genealogic care cuprinde toți descendenții direcți ai unei singure entități numite directorul rădăcină („`/`”): astfel, subdirectoarele au părinți, iar o rută arată ascendența completă a unui fișier. Există, de asemenea, rute relative care încep în alt loc decât directorul rădăcină. Trebuie să rețineți că directorul „`../`” se referă la directorul părinte. Această terminologie se aplică și altor structuri de tip director, cum ar fi structurile de date ierarhice.

- Nu există nicio componentă specială a numelui rutei de director care să corespundă unui dispozitiv fizic, cum ar fi discul dur. Acest lucru diferă de RT-11, CP/M, OpenVMS, MS-DOS, AmigaOS și Microsoft Windows, unde ruta conține un nume de dispozitiv, cum ar fi „`C:\`”. (Cu toate acestea, există intrări de director care se referă la dispozitive fizice ca parte a sistemului de fișiere normal. Consultați Secțiune 1.2.2, „Elementele interne ale sistemului de fișiere”.)

| Notă

Deși puteți utiliza aproape orice litere sau simboluri într-un nume de fișier, în practică nu este recomandat să faceți acest lucru. Este mai bine să evitați orice caractere care au adesea semnificații speciale în linia de comandă, inclusiv spații, tabulatoare, linii noi și alte caractere speciale: `{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $`. Dacă doriți să separați cuvintele dintr-un nume, alegeri bune sunt punctul, cratima și linia de subliniere. De asemenea, puteți scrie fiecare cuvânt cu majusculă la început, „`CaAcesta`”. Utilizatorii experimentați de Linux tind să evite spațiile în numele fișierelor.

| Notă
Cuvântul „root” poate însemna fie „utilizatorul root”, fie „directorul root”. Contextul utilizării lor ar trebui să clarifice acest lucru.

| Notă
Cuvântul rută (path) este folosit nu doar pentru nume de fișier complet calificat, așa cum s-a menționat mai sus, ci și pentru ruta de căutare a comenzii. Semnificația intenționată este de obicei clară din context.

Cele mai bune practici detaliate pentru ierarhia fișierelor sunt descrise în Filesystem Hierarchy Standard -- Standardul de ierarhie a sistemului de fișiere („`/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz`” și hier(7)). Ar trebui să rețineți următoarele aspecte ca punct de plecare.

Tabel 1.3. Lista directoarelor cheie și descrierea utilizării acestora

director | utilizarea directorului
--- | ---
`/` | directorul rădăcină
`/etc/` | fișierele de configurare la nivel de sistem
`/var/log/` | fișierele de jurnal ale sistemului
`/home/` | toate directoarele personale (acasă) pentru toți utilizatorii fără privilegii

### 1.2.2. Elementele interne ale sistemului de fișiere

Urmând tradiția Unix, sistemul Debian GNU/Linux oferă sistemul de fișiere în care se află datele fizice de pe discurile dure și alte dispozitive de stocare, iar interacțiunea cu dispozitivele hardware, cum ar fi ecranele consolei și consolele seriale la distanță, este reprezentată într-o manieră unificată sub „`/dev/`”.

Fiecare fișier, director, conductă cu nume (o modalitate prin care două programe pot partaja date) sau dispozitiv fizic dintr-un sistem Debian GNU/Linux are o structură de date numită nod-i care descrie atributele asociate, cum ar fi utilizatorul care îl deține (proprietarul), grupul căruia îi aparține, ora ultimei accesări etc. Ideea de a reprezenta aproape totul în sistemul de fișiere a fost o inovație Unix, iar nucleele Linux moderne au dezvoltat această idee și mai mult. Acum, chiar și informațiile despre procesele care rulează în calculator pot fi găsite în sistemul de fișiere.

Această reprezentare abstractă și unificată a entităților fizice și a proceselor interne este foarte puternică, deoarece ne permite să folosim aceeași comandă pentru același tip de operație pe multe dispozitive total diferite. Este chiar posibil să se modifice modul de funcționare al nucleului prin scrierea de date în fișiere speciale care sunt legate de procesele în execuție.

| Indicație
Dacă trebuie să identificați corespondența dintre arborele de fișiere și entitatea fizică, executați mount(8) fără argumente.

### 1.2.3. Permisiuni ale sistemului de fișiere

Permisiunile sistemului de fișiere ale unui sistem precum Unix sunt definite pentru trei categorii de utilizatori afectați.

- Utilizatorul care deține fișierul (u)

- Alți utilizatori din grupul căruia aparține fișierul (g)

- Toți ceilalți utilizatori (o), denumiți și „lumea” și „toată lumea”

Pentru fișier, fiecare permisiune corespunzătoare permite următoarele acțiuni.

- Permisiunea de citire - (read) (r) permite proprietarului să examineze conținutul fișierului.

- Permisiunea de scriere - (write) (w) permite proprietarului să modifice fișierul.

- Permisiunea de executare - (execute) (x) permite proprietarului să execute fișierul ca o comandă.

Pentru director, fiecare permisiune corespunzătoare permite următoarele acțiuni.

- Permisiunea de citire - (read) (r) permite proprietarului să afișeze conținutul directorului.

- Permisiunea de scriere - (write) (w) permite proprietarului să adauge sau să elimine fișiere din director.

- Permisiunea de executare - (execute) (x) permite proprietarului să acceseze fișierele din director.

Aici, permisiunea de executare - (execute) asupra unui director înseamnă nu numai să permită citirea fișierelor din acel director, ci și să permită vizualizarea atributelor acestora, cum ar fi dimensiunea și data modificării.

Instrumentul ls(1) este utilizat pentru a afișa informații privind permisiunile (și altele) pentru fișiere și directoare. Când este invocat cu opțiunea „`-l`”, afișează următoarele informații în ordinea indicată.

- Tipul fișierului (primul caracter)

- Permisiunea de acces la fișier (nouă caractere, compuse din câte trei caractere pentru utilizator, grup și altele, în această ordine)

- Numărul de legături dure către fișier

- Numele utilizatorului care deține fișierul

- Numele grupului căruia îi aparține fișierul

- Dimensiunea fișierului în caractere (octeți)

- Data și ora fișierului (mtime)

- Numele fișierului

Tabel 1.4. Lista descriptivă a primului caracter din ieșirea comenziil «`ls -l`»

caracter | semnificație
--- | ---
`-` | fișier normal
`d` | director
`l` | legătură simbolică
`c` | nod de dispozitiv de caractere
`b` | nod de dispozitiv de blocuri
`p` | conductă cu nume
`s` | soclu

chown(1) este utilizat din contul root pentru a schimba proprietarul fișierului. chgrp(1) este utilizat din contul proprietarului fișierului sau din contul root pentru a schimba grupul fișierului. chmod(1) este utilizat din contul proprietarului fișierului sau din contul root pentru a schimba permisiunile de acces la fișiere și directoare. Sintaxa de bază pentru manipularea unui fișier `foo` este următoarea.

    # chown newowner foo
    # chgrp newgroup foo
    # chmod  [ugoa][+-=][rwxXst][,...] foo

De exemplu, puteți crea o structură de directoare care să aparțină utilizatorului `foo` și să fie partajată de grupul `bar` folosind următoarea comandă.

    # cd /some/location/
    # chown -R foo:bar .
    # chmod -R ug+rwX,o=rX .

Există încă trei biți de permisiune specială.

- Bit-ul set user ID (s sau S în loc de x al utilizatorului)

- Bit-ul set group ID (s sau S în loc de x al grupului)

- Bit-ul sticky (t sau T în loc de x al celorlalți)

Aici, rezultatul comenzii „`ls -l`” pentru acești biți este cu majuscule dacă biții de execuție ascunși de aceste rezultate sunt neactivați .

Activarea bitului set user ID pe un fișier executabil permite utilizatorului să execute fișierul executabil cu ID-ul proprietarului fișierului (de exemplu root). În mod similar, activarea bitului set group ID pentru un fișier executabil permite utilizatorului să execute fișierul executabil cu ID-ul de grup al fișierului (de exemplu, root). Deoarece activările acestor biți pot genera riscuri de securitate, activarea lor necesită o atenție sporită.

Activarea bitului set group ID pentru un director activează schema de creare a fișierelor tip BSD în care toate fișierele create în director aparțin grupului directorului.

Activarea bitului sticky pe un director împiedică ștergerea unui fișier din director de către un utilizator care nu este proprietarul fișierului. Pentru a securiza conținutul unui fișier din directoare care pot fi scrise de toată lumea, cum ar fi „`/tmp`” sau din directoare care pot fi scrise de grup, nu trebuie doar să redefiniți permisiunea de scriere pentru fișier, ci și să activați bitul sticky pe director. În caz contrar, fișierul poate fi șters și poate fi creat un fișier nou cu același nume de către orice utilizator care are acces de scriere la director.

Iată câteva exemple interesante de permisiuni pentru fișiere.

    $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
    crw------T 1 root root   108, 0 Oct 16 20:57 /dev/ppp
    -rw-r--r-- 1 root root     2761 Aug 30 10:38 /etc/passwd
    -rw-r----- 1 root shadow   1695 Aug 30 10:38 /etc/shadow
    -rwsr-xr-x 1 root root   973824 Sep 23 20:04 /usr/sbin/exim4
    $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
    drwxrwxrwt 14 root root  20480 Oct 16 21:25 /tmp
    drwxrwsr-x 10 root staff  4096 Sep 29 22:50 /usr/local
    drwxr-xr-x 10 root root   4096 Oct 11 00:28 /usr/src
    drwxrwsr-x  2 root mail   4096 Oct 15 21:40 /var/mail
    drwxrwxrwt  3 root root   4096 Oct 16 21:20 /var/tmp

Există un mod numeric alternativ pentru a descrie permisiunile fișierelor cu chmod(1). Acest mod numeric utilizează numere octale (în bază=8) cu 3 până la 4 cifre.

Tabel 1.5. Modul numeric pentru permisiunile de fișiere în comenzile chmod(1)

cifra | semnificație
--- | ---
prima cifră (opțională) | suma dintre bitul set user ID (=4), bitul set group ID (=2) și bitul sticky (=1)
a doua cifră | suma permisiunilor citire (=4), scriere (=2) și executare (=1) pentru utilizator
a treia cifră | la fel ca a doua cifră, dar pentru grup
a patra cifră | la fel ca a doua cifră, dar pentru ceilalți

Sună complicat, dar de fapt este destul de simplu. Dacă vă uitați la primele câteva coloane (2-10) din „`ls -l`” și le citiți ca o reprezentare binară (bază=2) a permisiunilor de fișier („-” fiind „0” și „rwx” fiind „1”), ultimele 3 cifre ale valorii numerice ale modului ar trebui să aibă sens ca o reprezentare octală (bază=8) a permisiunilor de fișier.

De exemplu, încercați următoarele

    $ touch foo bar
    $ chmod u=rw,go=r foo
    $ chmod 644 bar
    $ ls -l foo bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
    -rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo

| Indicație
Dacă trebuie să accesați informațiile afișate de „`ls -l`” într-un script shell, trebuie să utilizați comenzi relevante, cum ar fi test(1), stat(1) și readlink(1). Se pot utiliza și comenzi încorporate în shell, cum ar fi „`[`” sau „`test`”.

### 1.2.4. Controlul permisiunilor pentru fișierele nou create: umask

Permisiunile aplicate unui fișier sau director nou creat sunt restricționate de comanda încorporată în shell `umask`. Consultați dash(1), bash(1) și builtins(7).

     (file permissions) = (requested file permissions) & ~(umask value)

Tabel 1.6. Exemple de valori pentru umask

umask | permisiunile fișierelor create | permisiunile directoarelor create | utilizare
--- | --- | --- | ---
`0022` | `-rw-r--r--` | `-rwxr-xr-x` | poate fi scris numai de către utilizator
`0002` | `-rw-rw-r--` | `-rwxrwxr-x` | poate fi scris de grup

Sistemul Debian utilizează în mod implicit o schemă de grupuri private de utilizatori („user private group”: UPG). Un UPG este creat de fiecare dată când un nou utilizator este adăugat în sistem. Un UPG are același nume ca utilizatorul pentru care a fost creat, iar acel utilizator este singurul membru al UPG. Schema UPG face ca stabilirea umask la `0002` să fie sigură, deoarece fiecare utilizator are propriul grup privat; (în unele variante Unix, este destul de obișnuit să se configureze toți utilizatorii normali aparținând unui singur grup `users` și este o idee bună să se stabilească umask la `0022` pentru securitate în astfel de cazuri).

| Indicație
Activați UPG introducând „`umask 002`” în fișierul `~/.bashrc`.

### 1.2.5. Permisiuni pentru grupuri de utilizatori (grup)

| Avertisment
Asigurați-vă că salvați modificările nesalvate înainte de a reporni sau de a efectua acțiuni similare.

Puteți adăuga un utilizator `penguin` la un grup `bird` în doi pași:

- Modificați configurația grupului utilizând una dintre următoarele opțiuni:

  - Executați «`sudo usermod -aG bird penguin`».

  - Executați «`sudo adduser penguin bird`» (numai pe sistemele Debian tipice)

  - Executați «`sudo vigr`» pentru `/etc/group` și «`sudo vigr -s`» pentru `/etc/gshadow` pentru a adăuga `penguin` în linia pentru `bird`.

- Aplicați configurația utilizând una dintre următoarele opțiuni:

  - Reporniți sistemul și conectați-vă (cea mai bună opțiune)

  - Ieșire din sesiune prin intermediul meniului interfeței grafice și autentificare; (acest lucru poate să nu funcționeze în mediul grafic de birou modern).

Puteți elimina un utilizator `penguin` dintr-un grup `bird` în doi pași:

- Modificați configurația grupului utilizând una dintre următoarele opțiuni:

  - Executați «`sudo usermod -rG bird penguin`».

  - Executați «`sudo deluser penguin bird`» (numai pe sistemele Debian tipice)

  - Executați «`sudo vigr`» pentru `/etc/group` și «`sudo vigr -s`» pentru `/etc/gshadow` pentru a elimina `penguin` din linia pentru `bird`.

- Aplicați configurația utilizând una dintre următoarele opțiuni:

  - Reporniți sistemul și conectați-vă (cea mai bună opțiune)

  - Executați «`kill -TERM -1`» și efectuați câteva acțiuni de remediere, cum ar fi «`systemctl restart NetworkManager.service`».

  - Deconectarea prin meniul interfeței grafice nu este o opțiune pentru mediul grafic de birou Gnome.

Orice încercare de repornire la cald este o înlocuire fragilă a repornirii la rece reale în cadrul sistemului de birou modern.

| Notă
Alternativ, puteți adăuga dinamic utilizatori la grupuri în timpul procesului de autentificare, adăugând linia „`auth optional pam_group.so`” la „`/etc/pam.d/common-auth`” și configurând „`/etc/security/group.conf`”; (consultați Cap. 4, Autentificare și controale de acces).

Dispozitivele fizice sunt doar un alt tip de fișier în sistemul Debian. Dacă aveți probleme cu accesarea dispozitivelor precum unitatea flash USB și unitatea CD-ROM dintr-un cont de utilizator, ar trebui să adăugați utilizatorul respectiv ca membru al grupului relevant.

Unele grupuri importante (notabile) furnizate de sistem permit membrilor lor să acceseze anumite fișiere și dispozitive fără privilegii `root`.

Tabel 1.7. Lista grupurilor notabile furnizate de sistem pentru accesul la fișiere

grupul | descrierea fișierelor și dispozitivelor accesibile
--- | ---
`dialout` | acces complet și direct la porturile seriale („`/dev/ttyS[0-3]`”)
`dip` | acces limitat la porturile seriale pentru conexiunea Dialup IP la mașini de încredere
`cdrom` | unități CD-ROM, DVD+/-RW
`audio` | dispozitiv audio
`video` | dispozitiv video
`scanner` | scaner(e)
`adm` | jurnalele de monitorizare a sistemului
`staff` | unele directoare pentru lucrări administrative minore: „`/usr/local`”, „`/home`”

| Indicație
Trebuie să aparțineți grupului `dialout` pentru a reconfigura modemul, a forma orice număr etc. Dar dacă `root` creează fișiere de configurare predefinite pentru partenerii (mașinile) de încredere în „`/etc/ppp/peers/` ”, trebuie doar să aparțineți grupului `dip` pentru a crea o conexiune Dialup IP la acele mașini de încredere folosind comenzile pppd(8), pon(1) și poff(1).

Unele grupuri notabile furnizate de sistem permit membrilor lor să execute anumite comenzi fără privilegii `root`.

Tabel 1.8. Lista grupurilor notabile furnizate de sistem pentru executarea anumitor comenzi

grupul | comenzi disponibile
--- | ---
`sudo` | execută orice comandă cu privilegii de superutilizator
`lpadmin` | execută comenzi pentru a adăuga, modifica și elimina imprimante din bazele de date ale imprimantelor

Pentru lista completă a utilizatorilor și grupurilor furnizate de sistem, consultați versiunea recentă a documentului „Utilizatori și grupuri” din „`/usr/share/doc/base-passwd/users-and-groups.html`” furnizat de pachetul `base-passwd`.

Consultați passwd(5), group(5), shadow(5), newgrp(1), vipw(8), vigr(8) și pam_group(8) pentru comenzile de gestionare a utilizatorilor și grupurilor din sistem.

### 1.2.6. Marcaje de timp

Există trei tipuri de marcaje de timp pentru un fișier GNU/Linux.

Tabel 1.9. Lista tipurilor de marcaje de timp

tipul | semnificația (definiția istorică Unix)
--- | ---
mtime | momentul modificării fișierului (`ls -l`)
ctime | momentul modificării stării fișierului (`ls -lc`)
atime | ultima dată când a fost accesat fișierul (`ls -lu`)

| Notă
ctime nu este ora creării fișierului.

| Notă
Valoarea reală a atime pe sistemul GNU/Linux poate fi diferită de cea din definiția istorică Unix.

- Suprascrierea unui fișier modifică toate atributele mtime, ctime și atime ale fișierului.

- Schimbarea proprietarului sau a permisiunilor unui fișier modifică atributele ctime și atime ale fișierului.

- Citirea unui fișier modifică atributul atime al fișierului în sistemul Unix clasic.

- Citirea unui fișier modifică atributul atime al fișierului pe sistemul GNU/Linux dacă sistemul său de fișiere este montat cu „`strictatime`”.

- Citirea unui fișier pentru prima dată sau după o zi modifică atributul atime al fișierului pe sistemul GNU/Linux dacă sistemul său de fișiere este montat cu „`relatime`”; comportamentul implicit începând cu Linux 2.6.30).

- Citirea unui fișier nu modifică atributul atime al fișierului pe sistemul GNU/Linux dacă sistemul său de fișiere este montat cu „`noatime`”.

| Notă

Opțiunile de montare „`noatime`” și „`relatime`” sunt introduse pentru a îmbunătăți performanța de citire a sistemului de fișiere în condiții normale de utilizare. Operația simplă de citire a fișierelor în cadrul opțiunii „`strictatime`” însoțește operația de scriere care consumă mult timp pentru a actualiza atributul atime. Dar atributul atime este rar utilizat, cu excepția fișierului mbox(5). Consultați mount(8).

Utilizați comanda touch(1) pentru a modifica marcajele temporale ale fișierelor existente.

Pentru marcajele temporale, comanda `ls` afișează șiruri traduse în limbi diferite de engleză („`fr_FR.UTF-8`”).

    $ LANG=C  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=en_US.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
    $ LANG=fr_FR.UTF-8  ls -l foo
    -rw-rw-r-- 1 penguin penguin 0 oct. 16 21:35 foo

| Indicație
Consultați Secțiune 9.3.4, „Afișare personalizată a orei și datei” pentru a personaliza ieșirea comenzii «`ls -l`».

### 1.2.7. Legături

Există două metode de asociere a unui fișier „`foo`” cu un nume de fișier diferit „`bar`”.

- Legătură dură

  - Nume duplicat pentru un fișier existent

  - «`ln foo bar`»

- Legătură simbolică sau symlink

  - Fișier special care indică un alt fișier după nume

  - «`ln -s foo bar`»

A se vedea exemplul următor pentru modificările numărului de legături și diferențele subtile în rezultatul comenzii «`rm`».

    $ umask 002
    $ echo "Original Content" > foo
    $ ls -li foo
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
    $ ln foo bar     # hard link
    $ ln -s foo baz  # symlink
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
    $ rm foo
    $ echo "New Content" > foo
    $ ls -li foo bar baz
    1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
    1450180 lrwxrwxrwx 1 penguin penguin  3 Oct 16 21:47 baz -> foo
    1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
    $ cat bar
    Original Content
    $ cat baz
    New Content

Legătura dură poate fi creată în cadrul aceluiași sistem de fișiere și are același număr de nod-i, pe care îl afișează opțiunea „`-i`” cu ls(1) .

Legătura simbolică are întotdeauna permisiuni nominale de acces la fișiere de tipul „`rwxrwxrwx`”, așa cum se arată în exemplul de mai sus, permisiunile efective de acces fiind dictate de permisiunile fișierului către care face trimitere.

| Atenție
În general, este o idee bună să nu creați legături simbolice sau legături dure complicate, cu excepția cazului în care aveți un motiv foarte bun. Acest lucru poate provoca probleme în care combinația logică a legăturilor simbolice duce la bucle în sistemul de fișiere.

| Notă
În general, este preferabil să utilizați legături simbolice în locul legăturilor dure, cu excepția cazului în care aveți un motiv întemeiat pentru a utiliza o legătură dură.

Directorul „`.`” conține legături către directorul în care apare, astfel încât numărul de legături ale oricărui director nou începe de la 2. Directorul „`..`” conține legături către directorul părinte, astfel încât numărul de legături ale directorului crește odată cu adăugarea de noi subdirectoare.

Dacă tocmai treceți de la Windows la Linux, veți observa rapid cât de bine concepută este legarea fișierelor în Unix, în comparație cu echivalentul Windows al „scurtăturilor”. Deoarece este implementată în sistemul de fișiere, aplicațiile nu pot vedea nicio diferență între un fișier legat și original. În cazul legăturilor dure, nu există nicio diferență.

### 1.2.8. Conducte cu nume (FIFO)

O conductă cu nume este un fișier care funcționează ca o conductă. Introduceți ceva în fișier și acesta iese la celălalt capăt. De aceea se numește FIFO, sau First-In-First-Out (primul intrat, primul ieșit): primul lucru pe care îl introduceți în conductă este primul lucru care iese la celălalt capăt.

Dacă scrieți într-o conductă cu nume, procesul care scrie în conductă nu se termină până când informațiile scrise nu sunt citite din conductă. Dacă citiți dintr-o conductă cu nume, procesul de citire așteaptă până când nu mai este nimic de citit înainte de a se termina. Dimensiunea conductei este întotdeauna zero --- nu stochează date, ci doar leagă două procese, similar funcționalității oferite de sintaxa shell „`|`”. Cu toate acestea, deoarece această conductă are un nume, cele două procese nu trebuie să se afle pe aceeași linie de comandă și nici măcar să fie rulate de același utilizator. Conductele au reprezentat o inovație foarte influentă a sistemului Unix.

De exemplu, încercați următoarele

    $ cd; mkfifo mypipe
    $ echo "hello" >mypipe & # put into background
    [1] 8022
    $ ls -l mypipe
    prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe
    $ cat mypipe
    hello
    [1]+  Done                    echo "hello" >mypipe
    $ ls mypipe
    mypipe
    $ rm mypipe

### 1.2.9. Socluri

Soclurile sunt utilizate pe scară largă de toate comunicațiile pe Internet, bazele de date și sistemul de operare în sine. Este similar cu conducta cu nume (FIFO) și permite proceselor să schimbe informații chiar și între calculatoare diferite. Pentru soclu, aceste procese nu trebuie să ruleze în același timp și nici să ruleze ca procese secundare ale aceluiași proces ancestral. Acesta este punctul final pentru comunicarea între procese (IPC). Schimbul de informații poate avea loc prin rețea între diferite gazde. Cele mai comune două sunt soclul Internet și soclul de domeniu Unix.

| Indicație
«`ss -t -u -a`» (din pachetul `iproute2`) oferă o imagine de ansamblu foarte utilă asupra soclurilor deschise pe un anumit sistem.

### 1.2.10. Fișiere de dispozitive

Fișierele de dispozitive se referă la dispozitivele fizice sau virtuale din sistemul dvs., cum ar fi discul dur, placa video, ecranul sau tastatura. Un exemplu de dispozitiv virtual este consola, reprezentată de „`/dev/console`”.

Există 2 tipuri de fișiere de dispozitiv.

- Dispozitiv de caractere

  - accesat de câte un caracter pe rând

  - 1 caracter = 1 octet

  - De exemplu, tastatura, portul serial, …

- Dispozitiv de blocuri

  - accesat în unități mai mari numite blocuri

  - 1 bloc > 1 octet

  - De exemplu, discul dur, …

Puteți citi și scrie fișiere de dispozitiv, deși fișierul poate conține date binare care pot fi incomprehensibile pentru oameni. Scrierea datelor direct în aceste fișiere este uneori utilă pentru depanarea conexiunilor hardware. De exemplu, puteți descărca un fișier text pe dispozitivul de imprimare „`/dev/lp0`” sau puteți trimite comenzi modem către portul serial corespunzător „`/dev/ttyS0`”. Dar, dacă nu se face cu atenție, acest lucru poate provoca o catastrofă majoră. Așadar, fiți precauți.

| Notă
Pentru accesul normal la o imprimantă, utilizați lp(1).

Numărul nodului dispozitivului este afișat prin executarea comenzii ls(1), după cum urmează.

    $ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero
    brw-rw---T  1 root disk     8,  0 Oct 16 20:57 /dev/sda
    brw-rw---T+ 1 root cdrom   11,  0 Oct 16 21:53 /dev/sr0
    crw-rw---T  1 root dialout  4, 64 Oct 16 20:57 /dev/ttyS0
    crw-rw-rw-  1 root root     1,  5 Oct 16 20:57 /dev/zero

- „`/dev/sda`” are numărul major al dispozitivului 8 și numărul minor al dispozitivului 0. Acesta este accesibil în mod citire/scriere pentru utilizatorii care aparțin grupului `disk`.

- „`/dev/sr0`” are numărul major al dispozitivului 11 și numărul minor al dispozitivului 0. Acesta este accesibil în mod citire/scriere pentru utilizatorii care aparțin grupului `cdrom`.

- „`/dev/ttyS0`” are numărul major al dispozitivului 4 și numărul minor al dispozitivului 64. Acesta este accesibil în mod citire/scriere pentru utilizatorii care aparțin grupului `dialout`.

- „`/dev/zero`” are numărul major al dispozitivului 1 și numărul minor al dispozitivului 5. Acesta poate fi citit/scris de către oricine.

În sistemul Linux modern, sistemul de fișiere din „`/dev/`” este completat automat de mecanismul udev(7).

### 1.2.11. Fișiere de dispozitive speciale

Există câteva fișiere speciale pentru dispozitive.

Tabel 1.10. Lista fișierelor speciale de dispozitive

fișierul de dispozitiv | acțiunea | descrierea răspunsului
--- | --- | ---
`/dev/null` | citire | returnează „caracterul de sfârșit de fișier (EOF)”
`/dev/null` | scriere | nu returnează nimic (o groapă fără fund pentru stocarea datelor)
`/dev/zero` | citire | returnează „caracterul `\0` (NUL)” (nu este același cu numărul zero ASCII)
`/dev/random` | citire | returnează caractere aleatorii dintr-un generator de numere aleatorii reale, oferind entropie reală (lent)
`/dev/urandom` | citire | returnează caractere aleatorii dintr-un generator de numere pseudoaleatorii securizat criptografic
`/dev/full` | scriere | returnează eroarea de disc plin (ENOSPC)

Acestea sunt utilizate frecvent împreună cu redirecționarea shell-ului (a se vedea Secțiune 1.5.8, „Secvențe tipice de comenzi și redirecționarea shell-ului”).

### 1.2.12. procfs și sysfs

procfs și sysfs montate pe „`/proc`” și „`/sys`” sunt pseudo-sisteme de fișiere și expun structurile de date interne ale nucleului către spațiul utilizatorului. Cu alte cuvinte, aceste intrări sunt virtuale, ceea ce înseamnă că acționează ca o fereastră convenabilă către funcționarea sistemului de operare.

Directorul „`/proc`” conține (printre altele) un subdirector pentru fiecare proces care rulează în sistem, numit după ID-ul procesului (PID). Utilitarele de sistem care accesează informații despre procese, cum ar fi ps(1), obțin informațiile din această structură de directoare.

Directoarele din „`/proc/sys/`” conțin interfețe pentru modificarea anumitor parametri ai nucleului în timpul rulări; (puteți face același lucru prin comanda specializată sysctl(8) sau prin fișierul său de preîncărcare/configurare „`/etc/sysctl.d/*.conf`”).

Oamenii intră adesea în panică când observă un anumit fișier - „`/proc/kcore`” - care este, în general, foarte mare. Acesta este (mai mult sau mai puțin) o copie a conținutului memoriei calculatorului dvs. Este utilizat pentru depanarea nucleului. Este un fișier virtual care indică memoria calculatorului, așa că nu vă faceți griji în privința dimensiunii sale.

Directoarele din „`/sys`” conține structuri de date exportate ale nucleului, atributele acestora și legăturile dintre ele. De asemenea, conține interfețe pentru modificarea anumitor parametri ai nucleului în timpul rulării.

A se vedea „`proc.txt(.gz)`”, „`sysfs.txt(.gz)`” și alte documente conexe din documentația nucleului Linux („`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`”) furnizate de pachetul `linux-doc-*`.

### 1.2.13. tmpfs

tmpfs este un sistem de fișiere temporar care păstrează toate fișierele în memoria virtuală. Datele din tmpfs din cache-ul paginii din memorie pot fi transferate în spațiul de interschimb (swap) de pe disc, după cum este necesar.

Directorul „`/run`” este montat ca tmpfs în procesul de pornire inițială. Acest lucru permite scrierea în el chiar și atunci când directorul „`/`” este montat ca fiind numai pentru citire. Aceasta este noua locație pentru stocarea fișierelor de stare tranzitorie și înlocuiește mai multe locații descrise în Filesystem Hierarchy Standard versiunea 2.3:

- „`/var/run`” → „`/run`”

- „`/var/lock`” → „`/run/lock`”

- "`/dev/shm`" → "`/run/shm`"

A se vedea „`tmpfs.txt(.gz)`” în documentația nucleului Linux („`/usr/share/doc/linux-doc-*/Documentation/filesystems/*`”) furnizată de pachetul `linux-doc-*`.

## 1.3. Midnight Commander (MC)

Midnight Commander (MC) este un „briceag elvețian” GNU pentru consola Linux și alte medii terminale. Acesta oferă începătorilor o experiență de consolă bazată pe meniuri, mult mai ușor de învățat decât comenzile standard Unix.

Este posibil să fie necesar să instalați pachetul Midnight Commander, denumit „`mc`”, urmând pașii de mai jos.

    $ sudo apt-get install mc

Utilizați comanda mc(1) pentru a explora sistemul Debian. Acesta este cel mai bun mod de a învăța. Explorați câteva locații interesante folosind tastele săgeții și tasta Enter.

- „`/etc`” și subdirectoarele acestuia

- „`/var/log`” și subdirectoarele acestuia

- „`/usr/share/doc`” și subdirectoarele acestuia

- „`/usr/sbin`” și „`/usr/bin`”

### 1.3.1. Personalizarea MC

Pentru a face ca MC să schimbe directorul de lucru la ieșire și după aceea a executa`cd` către director, sugerez să modificați „`~/.bashrc`” pentru a include un script furnizat de pachetul `mc`.

    . /usr/lib/mc/mc.sh

Vedeți mc(1) (sub opțiunea „`-P`”) pentru a afla motivul. Dacă nu înțelegeți exact despre ce vorbesc aici, puteți face acest lucru mai târziu.

### 1.3.2. Lansarea MC

MC poate fi lansat astfel.

    $ mc

MC se ocupă de toate operațiile cu fișiere prin intermediul meniului său, necesitând un efort minim din partea utilizatorului. Apăsați tasta F1 pentru a afișa ecranul de ajutor. Puteți utiliza MC apăsând tastele cursorului și tastele de funcții.

| Notă
În unele console, cum ar fi gnome-terminal(1), apăsările tastelor de funcții pot fi interceptate de programul consolei. Puteți dezactiva aceste funcții în meniul „Preferințe” → „General” și „Comenzi rapide” pentru `gnome-terminal`.

Dacă întâmpinați probleme de codificare a caracterelor care afișează caractere neinteligibile, adăugarea „`-a`” la linia de comandă MC poate ajuta la prevenirea problemelor.

Dacă acest lucru nu rezolvă problemele de afișare cu MC, consultați Secțiune 8.3.1, „Configurația terminalului”.

### 1.3.3. Gestionarul de fișiere din MC

Implicit sunt două panouri de directoare care conțin liste de fișiere. Un alt mod util este configurarea ferestrei din dreapta pe „informații” pentru a vedea informații despre privilegiile de acces la fișiere etc. În continuare sunt prezentate câteva comenzi esențiale. Cu demonul gpm(8) în funcțiune, se poate utiliza mouse-ul și pe consolele de caractere Linux. (Asigurați-vă că apăsați tasta Shift pentru a obține comportamentul normal al funcțiilor de tăiere și lipire în MC.)

Tabel 1.11. Tastele de comenzi rapide ale MC

tasta | comanda/funcția asociată
--- | ---
`F1` | meniul de ajutor
`F3` | vizorul de fișiere intern
`F4` | editorul intern
`F9` | activează meniul derulant
`F10` | ieșire din Midnight Commander
`Tab` | deplasare între două ferestre
`Insert` sau `Ctrl-T` | marchează fișierul pentru o operație cu mai multe fișiere, cum ar fi copierea
`Del` | șterge fișierul (aveți grijă --- configurați MC în modul de ștergere sigură)
Tastele cursor | auto-explicative

### 1.3.4. Trucuri din linia de comandă în MC

- Comanda `cd` modifică directorul afișat pe ecranul selectat.

- `Ctrl-Enter` sau `Alt-Enter` copiază un nume de fișier în linia de comandă. Utilizați această comandă împreună cu comenzile cp(1) și mv(1) și cu editarea liniei de comandă.

- `Alt-Tab` afișează opțiunile de extindere a numelor de fișiere din shell.

- Se poate specifica directorul de pornire pentru ambele ferestre ca argumente pentru MC; de exemplu, „`mc /etc /root`”.

- `Esc` + `n-key` → `Fn` (adică, `Esc` + `1` → `F1`, etc.; `Esc` + `0` → `F10`)

- Apăsarea tastei `Esc` înaintea tastei are același efect ca și apăsarea simultană a tastelor `Alt` și ; Adică, tastați `Esc` + `c` pentru `Alt-C`. `Esc` se numește meta-tastă și uneori este notată ca „`M-`”.

### 1.3.5. Editorul intern din MC

Editorul intern are o schemă interesantă de copiere și lipire. Apăsarea tastei `F3` marchează începutul unei selecții, o a doua apăsare a tastei `F3` marchează sfârșitul selecției și evidențiază selecția. Apoi puteți muta cursorul. Dacă apăsați tasta «F6», zona selectată este mutată la locația cursorului. Dacă apăsați tasta «F5», zona selectată este copiată și inserată la locația cursorului. `F2` salvează fișierul. `F10` vă scoate din program. Majoritatea tastelor cursorului funcționează intuitiv.

Acest editor poate fi pornit direct pe un fișier folosind una dintre următoarele comenzi.

    $ mc -e filename_to_edit

    $ mcedit filename_to_edit

Acesta nu este un editor cu ferestre multiple, dar se pot utiliza mai multe console Linux pentru a obține același efect. Pentru a copia între ferestre, utilizați tastele Alt-Fn pentru a comuta între consolele virtuale și utilizați „File→Insert file” (Fișier→Inserați fișier) sau „File→Copy to file” (Fișier→Copiați în fișier) pentru a muta o parte dintr-un fișier într-un alt fișier.

Acest editor intern poate fi înlocuit cu orice editor extern la alegere.

De asemenea, multe programe utilizează variabilele de mediu „`$EDITOR`” sau „`$VISUAL`” pentru a decide ce editor să utilizeze. Dacă nu vă simțiți confortabil cu vim(1) sau nano(1) la început, puteți defini aceste variabile ca „`mcedit`” adăugând următoarele linii în „`~/.bashrc`”.

    export EDITOR=mcedit
    export VISUAL=mcedit

Recomand să le definiți ca „`vim`”, dacă este posibil.

Dacă nu vă simțiți confortabil cu vim(1), puteți continua să utilizați mcedit(1) pentru majoritatea sarcinilor de întreținere a sistemului.

### 1.3.6. Vizorul intern din MC

MC este un vizor foarte inteligent. Este un instrument excelent pentru căutarea cuvintelor în documente. Îl folosesc întotdeauna pentru fișierele din directorul „`/usr/share/doc`”. Este cea mai rapidă modalitate de a răsfoi cantități mari de informații despre Linux. Acest vizor poate fi pornit direct folosind una dintre următoarele comenzi.

    $ mc -v path/to/filename_to_view

    $ mcview path/to/filename_to_view

### 1.3.7. Funcții de pornire automată ale MC

Apăsați tasta «Enter» pe un fișier, iar programul corespunzător va gestiona conținutul fișierului (consultați Secțiune 9.4.11, „Personalizarea programului care urmează să fie pornit”). Aceasta este o funcție MC foarte convenabilă.

Tabel 1.12. Reacția la apăsarea tastei «Enter» în MC

tipul fișierului | reacția la apăsarea tastei «Enter»
--- | ---
fișier executabil | execută comanda
fișier de pagină de manual | direcționează conținutul către software-ul de vizualizare
fișier html | direcționează conținutul către navigatorul web
fișiere „`*.tar.gz`” și „`*.deb`” | răsfoiește conținutul său ca și cum ar fi un subdirector

Pentru ca aceste funcții de vizualizare și fișiere virtuale să funcționeze, fișierele care pot fi vizualizate nu trebuie definite ca fiind executabile. Modificați-le starea folosind chmod(1) sau prin meniul fișier MC.

### 1.3.8. Sistemul de fișiere virtual al MC

MC poate fi utilizat pentru a accesa fișiere prin Internet. Accesați meniul apăsând `F9`, „`Enter`” și „`h`” pentru a activa sistemul de fișiere Shell. Introduceți o adresă URL în formatul „`sh://[[utilizator@]mașină[:opțiuni]/[director-la-distanță]`”, care recuperează un director la distanță care apare ca unul local utilizând `ssh`.

## 1.4. Mediul de lucru de bază de tip Unix

Deși MC vă permite să faceți aproape totul, este foarte important să învățați cum să utilizați instrumentele liniei de comandă invocate din promptul shell și să vă familiarizați cu mediul de lucru de tip Unix.

### 1.4.1. Shell-ul de autentificare

Deoarece shell-ul de autentificare poate fi utilizat de unele programe de inițializare a sistemului, este prudent să îl păstrați ca bash(1) și să evitați schimbarea shell-ului de autentificare cu chsh(1).

Dacă doriți să utilizați un prompt interactiv diferit, definiți-l din configurația emulatorului de terminal cu interfață grafică sau porniți-l din `~/.bashrc`, de exemplu, introducând „`exec /usr/bin/zsh -i -l`” sau „`exec /usr/bin/fish -i -l`”.

Tabel 1.13. Lista programelor shell

pachet | popcon(popularitate) | dimensiune | shell POSIX | descriere
--- | --- | --- | --- | ---
`bash` | V:893, I:1000 | 7309 | Da | Bash: GNU Bourne Again SHell (standard de facto)
`bash-completion` | V:37, I:960 | 1952 | N/D | completare programabilă pentru shell-ul bash
`dash` | V:928, I:998 | 207 | Da | Debian Almquist Shell, bun pentru scripturi shell
`zsh` | V:41, I:70 | 2571 | Da | Z shell: shell-ul standard cu numeroase îmbunătățiri
`tcsh` | V:4, I:15 | 1366 | Nu | TENEX C Shell: o versiune îmbunătățită a Berkeley csh
`mksh` | V:5.6, I:8.0 | 7713 | Da | O versiune a Korn shell
`csh` | V:1.1, I:5.1 | 348 | Nu | OpenBSD C Shell, o versiune a Berkeley csh
`sash` | V:0.3, I:5.1 | 1245 | Da | Shell autonom cu comenzi încorporate (nu este destinat pentru standardul „`/usr/bin/sh`”)
`ksh` | V:0.3, I:7.7 | 65 | Da | Versiunea reală, AT&T a Korn shell
`rc` | V:0.09, I:0.77 | 182 | Nu | Implementarea AT&T Plan 9 rc shell
`posh` | V:0.00, I:0.23 | 195 | Da | SHell obișnuit conform cu politica (derivat din `pdksh`)

| Indicație
Deși shell-urile de tip POSIX au aceeași sintaxă de bază, ele pot diferi în ceea ce privește comportamentul în aspecte fundamentale, precum variabilele shell și expansiunile globale (cu caractere joker). Vă rugăm să consultați documentația acestora pentru detalii.

În acest capitol al tutorialului, shell-ul interactiv înseamnă întotdeauna `bash`.

### 1.4.2. Personalizarea bash

Puteți personaliza comportamentul bash(1) prin „`~/.bashrc`”.

De exemplu, încercați următoarele.

    # enable bash-completion
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    # CD upon exiting MC
    . /usr/lib/mc/mc.sh

    # set CDPATH to a good one
    CDPATH=.:/usr/share/doc:~:~/Desktop:~
    export CDPATH

    PATH="${PATH+$PATH:}/usr/sbin:/sbin"
    # set PATH so it includes user's private bin if it exists
    if [ -d ~/bin ] ; then
      PATH="~/bin${PATH+:$PATH}"
    fi
    export PATH

    EDITOR=vim
    export EDITOR

| Indicație
Puteți găsi mai multe sfaturi de personalizare `bash`, cum ar fi Secțiune 9.3.6, „Comenzi colorate”, în Cap. 9, Sfaturi privind sistemul.

| Indicație
Pachetul `bash-completion` permite completarea programabilă pentru `bash`.

### 1.4.3. Combinații speciale de taste

În mediul de tip Unix există câteva combinații de taste care au semnificații speciale. Rețineți că pe o consolă Linux normală, numai tastele `Ctrl` și `Alt` din partea stângă funcționează așa cum vă așteptați. Iată câteva combinații de taste importante de reținut.

Tabel 1.14. Lista tastelor de comenzi rapide pentru bash

tasta | descrierea acțiunii efectuate
--- | ---
`Ctrl-U` | șterge linia din fața cursorului
`Ctrl-H` | șterge un caracter înaintea cursorului
`Ctrl-D` | termină introducerea („ieșire din shell” dacă utilizați shell)
`Ctrl-C` | termină un program în execuție
`Ctrl-Z` | oprește temporar programul mutându-l în fundal
`Ctrl-S` | oprește afișarea pe ecran
`Ctrl-Q` | reactivează ieșirea pe ecran
`Ctrl-Alt-Del` | repornește/oprește sistemul, a se vedea inittab(5)
`Tasta Alt stânga` (opțional, `Tasta Windows`) | meta-tastă pentru Emacs și interfețe similare
`Up-arrow` | pornește căutarea istoricului comenzilor sub `bash`
`Ctrl-R` | pornește căutarea incrementală în istoricul comenzilor sub `bash`
`Tab` | completează introducerea numelui fișierului în linia de comandă sub `bash`
`Ctrl-V` `Tab` | introduce `Tab` fără extindere în linia de comandă sub `bash`

| Indicație
Funcția terminalului `Ctrl-S` poate fi dezactivată folosind stty(1).

### 1.4.4. Operații cu mouse-ul

Operațiile cu mouse-ul pentru text în sistemul Debian combină două stiluri cu câteva modificări:

- Operații tradiționale ale mouse-ului în stil Unix:

  - utilizează 3 butoane (clic)

  - utilizare PRIMARĂ

  - utilizată de aplicații X precum `xterm` și aplicații text în consola Linux

- Operații moderne cu mouse-ul în stil de interfață grafică:

  - utilizează 2 butoane (glisare + clic)

  - utilizare PRIMARĂ și CLIPBOARD

  - utilizată în aplicații cu interfață grafică modernă, cum ar fi `gnome-terminal`

Tabel 1.15. Lista operațiilor mouse-ului și acțiunile tastelor asociate în Debian

acțiunea | răspunsul
--- | ---
Clic stânga și glisare cu mouse-ul | selectează intervalul ca selecție PRIMARĂ
Clic stânga | selectează începutul intervalului pentru selecția PRIMARĂ
Clic dreapta (tradițional) | selectează sfârșitul intervalului pentru selecția PRIMARĂ
Clic dreapta (modern) | meniu dependent de context (tăiere/copiere/lipire)
Clic pe butonul din mijloc sau Shift-`Ins` | inserează selecția PRIMARĂ la poziția cursorului
`Ctrl-X` | taie selecția PRIMARĂ în CLIPBOARD
`Ctrl-C` (`Shift-Ctrl-C` în terminal) | copiază selecția PRIMARĂ în CLIPBOARD
`Ctrl-V` | lipește conținutul CLIPBOARDULUI la poziția cursorului

Aici, selecția PRIMARĂ este intervalul de text evidențiat. În cadrul programului de terminal, se utilizează în schimb `Shift-Ctrl-C` pentru a evita închiderea unui program în execuție.

Rotița centrală a mouse-ului modern cu rotiță este considerată butonul din mijloc al mouse-ului și poate fi utilizată pentru clic-mijloc. Apăsarea simultană a butoanelor stânga și dreapta ale mouse-ului servește ca clic-mijloc în cazul unui mouse cu 2 butoane.

Pentru a utiliza un mouse în consolele de caractere Linux, trebuie să aveți gpm(8) rulând ca demon.

### 1.4.5. Paginatorul

Comanda less(1) este un paginator îmbunătățit (permite navigarea prin conținutul fișierelor). Citește fișierul specificat prin argumentul comenzii sau prin intrarea standard. Apăsați „`h`” dacă aveți nevoie de ajutor în timp ce navigați cu comanda `less`. Poate face mult mai mult decât more(1) și poate fi supraalimentat prin executarea „`eval $(lesspipe)`” sau „`eval $(lessfile)`” în scriptul de pornire al shell-ului. Pentru mai multe informații, consultați „`/usr/share/doc/less/LESSOPEN`”. Opțiunea „`-R`” permite afișarea caracterelor brute și activează secvențele de eludare a culorilor ANSI. Consultați less(1).

| Indicație
În comanda `less`, tastați „`h`” pentru a afișa ecranul de ajutor, tastați „`/`” sau „`?`” pentru a căuta un șir de caractere și tastați „`-i`” pentru a schimba respectarea/ignorarea diferenței dintre majuscule și minuscule.

### 1.4.6. Editorul de text

Ar trebui să deveniți expert într-una dintre variantele programelor Vim sau Emacs, care sunt populare în sistemele de tip Unix.

Cred că este bine să vă obișnuiți cu comenzile Vim, deoarece editorul Vi este mereu prezent în lumea Linux/Unix; (de fapt, programele originale `vi` sau noul `nvi` se găsesc peste tot. Am ales Vim pentru începători, deoarece oferă ajutor prin tasta `F1`, fiind suficient de similar și mai avansat).

Dacă ați ales Emacs sau XEmacs ca editor, aceasta este o altă alegere bună, în special pentru programare. Emacs are o mulțime de alte caracteristici, inclusiv funcționarea ca cititor de știri, editor de directoare, program de poștă electronică etc. Când este utilizat pentru programare sau editarea scripturilor shell, recunoaște în mod inteligent formatul asupra căruia lucrați și încearcă să vă ofere asistență. Unii oameni susțin că singurul program de care au nevoie pe Linux este Emacs. Zece minute de învățare a Emacs acum pot economisi ore mai târziu. Este foarte recomandat să aveți manualul GNU Emacs ca referință atunci când învățați Emacs.

Toate aceste programe vin de obicei cu un program de tutoriat pentru a le învăța prin practică. Porniți Vim tastând „`vim`” și apăsați tasta F1. Ar trebui să citiți cel puțin primele 35 de linii. Apoi urmați cursul de formare pe internet mutând cursorul la „`|tutor|`” și apăsând `Ctrl-]`.

| Notă

Editorii buni, precum Vim și Emacs, pot gestiona corect textele codificate în UTF-8 și alte codificări exotice. Este o idee bună să utilizați mediul de interfață grafică cu configurația regională pentru text, UTF-8 și să instalați programele și fonturile necesare în acesta. Editorii au opțiuni pentru a configura codificarea fișierelor independent de mediul de interfață grafică. Vă rugăm să consultați documentația acestora referitoare la textul multi-octet.

### 1.4.7. Definirea unui editor de text implicit

Debian vine cu o serie de editori diferiți. Vă recomandăm să instalați pachetul `vim`, așa cum s-a menționat mai sus.

Debian oferă acces unificat la editorul implicit al sistemului prin comanda „`/usr/bin/editor`”, astfel încât alte programe (de exemplu, reportbug(1)) să îl poată invoca. Îl puteți modifica după cum urmează.

    $ sudo update-alternatives --config editor

Alegerea „`/usr/bin/vim.basic`” în locul „`/usr/bin/vim.tiny`” este recomandarea mea pentru începători, deoarece oferă suport pentru evidențierea sintaxei.

| Indicație
Multe programe utilizează variabilele de mediu „`$EDITOR`” sau „`$VISUAL`” pentru a decide ce editor să utilizeze (consultați Secțiune 1.3.5, „Editorul intern din MC” și Secțiune 9.4.11, „Personalizarea programului care urmează să fie pornit”). Pentru consecvență în sistemul Debian, definiți aceste variabile la „`/usr/bin/editor`”; (în trecut, „`$EDITOR`” era „`ed`” și „`$VISUAL`” era „`vi`”).

### 1.4.8. Utilizarea editorului vim

Versiunea recentă vim(1) pornește în mod implicit cu opțiunea „`nocompatible`” și intră în modul `NORMAL`.[1]

Tabel 1.16. Lista combinațiilor de taste de bază din Vim

modul | combinația de taste | acțiunea
--- | --- | ---
`NORMAL` | `:help|only` | afișează fișierul de ajutor
`NORMAL` | `:e filename.ext` | deschide un nou spațiu tampon în memorie pentru a edita `filename.ext`
`NORMAL` | `:w` | suprascrie fișierul original cu conținutul tamponului curent
`NORMAL` | `:w filename.ext` | scrie tamponul curent în `filename.ext`
`NORMAL` | `:q` | ieșire din `vim`
`NORMAL` | `:q!` | forțează ieșirea din `vim`
`NORMAL` | `:only` | închide toate celelalte ferestre deschise
`NORMAL` | `:set nocompatible?` | verifică dacă `vim` se află în modul `nocompatible`
`NORMAL` | `:set nocompatible` | stabilește `vim` în modul de operare `nocompatible`
`NORMAL` | `i` | intră în modul `INSERARE`
`NORMAL` | `R` | intră în modul `ÎNLOCUIRE`
`NORMAL` | `v` | intră în modul `VIZUAL`
`NORMAL` | `V` | intră în modul `VIZUAL` pe linii
`NORMAL` | Ctrl-`V` | intrați în modul `VISUAL` pe blocuri
cu excepția `TERMINAL-JOB` | `ESC`-key | intră în modul `NORMAL`
`NORMAL` | `:term` | intră în modul `TERMINAL-JOB`
`TERMINAL-NORMAL` | `i` | intră în modul `TERMINAL-JOB`
`TERMINAL-JOB` | Ctrl-`W` `N` (sau Ctrl-`\` Ctrl-`N`) | intră în modul `TERMINAL-NORMAL`
`TERMINAL-JOB` | Ctrl-`W` `:` | intră în modul `Ex` din modul `TERMINAL-NORMAL`

Vă rugăm să utilizați programul „`vimtutor`” pentru a învăța `vim` printr-un curs tutorial interactiv.

Programul `vim` își modifică comportamentul în funcție de tastele apăsate, pe baza modului. Tastarea în tampon se face în principal în modul `INSERARE` și în modul `ÎNLOCUIRE`. Deplasarea cursorului se face în principal în modul `NORMAL`. Selecția interactivă se face în modul `VIZUAL` . Tastarea „`:`” în modul `NORMAL` schimbă modul în modul `Ex` . Modul `Ex` acceptă comenzi.

| Indicație
Vim vine cu pachetul Netrw. Netrw permite citirea și scrierea fișierelor, navigarea în directoare prin rețea și navigarea locală! Încercați Netrw cu „`vim .`” (un punct ca argument) și citiți manualul său la „`:help netrw`”.

Pentru configurarea avansată a `vim`, consultați Secțiune 9.2, „Personalizarea vim”.

### 1.4.9. Înregistrarea activităților shell-ului

Rezultatul comenzii shell poate să nu mai apară pe ecran și să se piardă definitiv. Este recomandat să înregistrați activitățile shell în fișier pentru a le putea revizui ulterior. Acest tip de înregistrare este esențial atunci când efectuați orice sarcini de administrare a sistemului.

| Indicație
Noul Vim (versiunea>=8.2) poate fi utilizat pentru a înregistra activitățile shell-ului în mod curat folosind modul `TERMINAL-JOB`. A se vedea Secțiune 1.4.8, „Utilizarea editorului vim”.

Metoda de bază pentru înregistrarea activității shell-ului este rularea acestuia sub script(1).

De exemplu, încercați următoarele

    $ script
    Script started, file is typescript

Executați orice comenzi shell sub `script`.

Apăsați `Ctrl-D` pentru a ieși din `script`.

    $ vim typescript

Consultați Secțiune 9.1.1, „Înregistrarea activităților shell în mod curat” .

### 1.4.10. Comenzi Unix de bază

Să învățăm comenzile de bază ale Unix. Aici folosesc „Unix” în sensul său generic. Orice sistem de operare clonă Unix oferă de obicei comenzi echivalente. Sistemul Debian nu face excepție. Nu vă faceți griji dacă unele comenzi nu funcționează așa cum doriți acum. Dacă `alias` este utilizat în shell, ieșirile corespunzătoare ale comenzii sunt diferite. Aceste exemple nu sunt menite să fie executate în această ordine.

Încercați toate comenzile următoare din contul de utilizator fără privilegii.

Tabel 1.17. Lista comenzilor Unix de bază

comandă | descriere
--- | ---
`pwd` | afișează numele directorului curent/de lucru
`whoami` | afișează numele utilizatorului curent
`id` | afișează identitatea utilizatorului curent (nume, uid, gid și grupurile asociate)
`file foo` | afișează tipul de fișier pentru fișierul „`foo`”
`type -p commandname` | afișează locația fișierului comenzii „`nume-comandă`”
`which commandname` | , ,
`type commandname` | afișează informații despre comanda „`nume-comandă`”
`apropos key-word` | găsește comenzi legate de „`cuvânt-cheie`”
`man -k key-word` | , ,
`whatis commandname` | afișează o explicație pe o singură linie privind comanda „`nume-comandă`”
`man -a commandname` | afișează explicația privind comanda „`nume-comandă`” (stil Unix)
`info commandname` | afișează o explicație destul de lungă privind comanda „`nume-comandă`” (stil GNU)
`ls` | listează conținutul directorului (fișiere și directoare fără punct)
`ls -a` | listează conținutul directorului (toate fișierele și directoarele)
`ls -A` | listează conținutul directorului (aproape toate fișierele și directoarele, adică omite „`..`” și „`.`”)
`ls -la` | listează tot conținutul directorului cu informații detaliate
`ls -lai` | listează tot conținutul directorului cu numărul de nod-i și informații detaliate
`ls -d` | listează toate directoarele din directorul curent
`tree` | afișează conținutul arborelui de fișiere
`lsof foo` | afișează starea deschisă a fișierului „`foo`”
`lsof -p pid` | listează fișierele deschise de ID-ul procesului: „`pid`”
`mkdir foo` | creează un nou director „`foo`” în directorul curent
`rmdir foo` | elimină directorul „`foo`” din directorul curent
`cd foo` | schimbă directorul în directorul „`foo`” din directorul curent sau din directorul listat în variabila „`$CDPATH`”
`cd /` | schimbă directorul la directorul rădăcină
`cd` | schimbă directorul la directorul personal al utilizatorului curent
`cd /foo` | schimbă directorul la directorul cu ruta absolută „`/foo`”
`cd ..` | schimbă directorul la directorul părinte
`cd ~foo` | schimbă directorul la directorul personal al utilizatorului „`foo`”
`cd -` | schimbă directorul la directorul anterior
`</etc/motd pager` | afișează conținutul fișierului „`/etc/motd`” folosind paginatorul implicit
`touch junkfile` | creați un fișier gol „`fișier-test`”
`cp foo bar` | copiază un fișier existent „`foo`” într-un fișier nou „`bar`”
`rm junkfile` | elimină fișierul „`fișier-test`”
`mv foo bar` | redenumește un fișier existent „`foo`” într-un nou nume „`bar`” („`bar`” nu trebuie să existe)
`mv foo bar` | mută un fișier existent „`foo`” într-o nouă locație „`bar/foo`” (directorul „`bar`” trebuie să existe)
`mv foo bar/baz` | mută un fișier existent „`foo`” într-o nouă locație cu un nou nume „`bar/baz`” (directorul „`bar`” trebuie să existe, dar directorul „`bar/baz`” nu trebuie să existe)
`chmod 600 foo` | face ca un fișier existent „`foo`” să fie necitibil și neinscriptibil de către alte persoane (neexecutabil pentru toți)
`chmod 644 foo` | face ca un fișier existent „`foo`” să fie citibil, dar neinscriptibil de către alte persoane (neexecutabil pentru toți)
`chmod 755 foo` | faceți ca un fișier existent „`foo`” să fie citibil, dar neinscriptibil de către alte persoane (executabil pentru toți)
`find . -name pattern` | găsește numele de fișiere ce coincid folosind shell-ul „`model`” (mai lent)
`locate -d . pattern` | găsește numele de fișiere ce coincid folosind shell-ul „`model`” (mai rapid folosind baza de date generată regulat)
`grep -e "pattern" *.html` | găsește un „`model`” în toate fișierele care se termină cu „`.html`” din directorul curent și le afișează pe toate
`top` | afișează informații despre proces pe ecran complet, tastați „`q`” pentru a ieși
`ps aux | pager` | afișează informații despre toate procesele care rulează utilizând ieșirea în stil BSD
`ps -ef | pager` | afișează informații despre toate procesele care rulează utilizând ieșirea în stilul Unix system-V
`ps aux | grep -e "[e]xim4*"` | afișează toate procesele care rulează „`exim`” și „`exim4`”
`ps axf | pager` | afișează informații despre toate procesele care rulează cu ieșire grafică ASCII
`kill 1234` | omoară un proces identificat prin ID-ul procesului: „1234”
`gzip foo` | comprimă „`foo`” pentru a crea „`foo.gz`” folosind algoritmul de codificare Lempel-Ziv (LZ77)
`gunzip foo.gz` | decomprimă „`foo.gz`” pentru a crea „`foo`”
`bzip2 foo` | comprimă „`foo`” pentru a crea „`foo.bz2`” folosind algoritmul de comprimare a textului Burrows-Wheeler și codificarea Huffman (comprimare mai bună decât `gzip`)
`bunzip2 foo.bz2` | decomprimă „`foo.bz2`” pentru a crea „`foo`”
`xz foo` | comprimă „`foo`” pentru a crea „`foo.xz`” folosind algoritmul lanțului Lempel–Ziv–Markov (comprimare mai bună decât `bzip2`)
`unxz foo.xz` | decomprimă „`foo.xz`” pentru a crea „`foo`”
`tar -xvf foo.tar` | extrage fișierele din arhiva „`foo.tar`”
`tar -xvzf foo.tar.gz` | extrage fișierele din arhiva comprimată gzip „`foo.tar.gz`”
`tar -xvjf foo.tar.bz2` | extrage fișierele din arhiva „`foo.tar.bz2`”
`tar -xvJf foo.tar.xz` | extrage fișierele din arhiva „`foo.tar.xz`”
`tar -cvf foo.tar bar/` | conținutul arhivei din dosarul „`bar/`” în arhiva „`foo.tar`”
`tar -cvzf foo.tar.gz bar/` | conținutul arhivei din dosarul „`bar/`” în arhiva comprimată „`foo.tar.gz`”
`tar -cvjf foo.tar.bz2 bar/` | conținutul arhivei din dosarul „`bar/`” în arhiva „`foo.tar.bz2`”
`tar -cvJf foo.tar.xz bar/` | conținutul arhivei din dosarul „`bar/`” în arhiva „`foo.tar.xz`”
`zcat README.gz | pager` | afișează conținutul fișierului comprimat „`README.gz`” utilizând paginatorul implicit
`zcat README.gz > foo` | creează un fișier „`foo`” cu conținutul decomprimat al „`README.gz`”
`zcat README.gz >> foo` | adaugă conținutul decomprimat al „`README.gz`” la sfârșitul fișierului „`foo`” (dacă acesta nu există, mai întâi îl creează)

| Notă

Unix are tradiția de a ascunde numele fișierelor care încep cu „`.`”. Acestea sunt, de obicei, fișiere care conțin informații de configurare și preferințele utilizatorului.

Pentru comanda `cd`, consultați builtins(7).

Paginatorul implicit al sistemului Debian de bază este more(1), care nu permite derularea înapoi. Prin instalarea pachetului `less` folosind linia de comandă „`apt-get install less`”, less(1) devine paginatorul implicit și puteți derula înapoi cu tastele cursorului.

„`[`” și „`]`” din expresia regulată a comenzii „`ps aux | grep -e „[e]xim4*”`” de mai sus permit `grep` să evite potrivirea cu sine însuși. „`4*`” din expresia regulată înseamnă 0 sau mai multe repetări ale caracterului „`4`”, permițând astfel lui `grep` să potrivească atât cu „`exim`”, cât și cu „`exim4`”. Deși „`*`” este utilizat în globalizarea numelui de fișier shell și în expresia regulată, semnificațiile lor sunt diferite. Aflați mai multe despre expresia regulată din grep(1).

Vă rugăm să parcurgeți directoarele și să aruncați o privire în sistem folosind comenzile de mai sus ca exercițiu. Dacă aveți întrebări cu privire la oricare dintre comenzile consolei, vă rugăm să citiți pagina manualului.

De exemplu, încercați următoarele

    $ man man
    $ man bash
    $ man builtins
    $ man grep
    $ man ls

Stilul paginilor de manual poate fi puțin dificil de asimilat, deoarece acestea sunt destul de concise, în special cele mai vechi, foarte tradiționale. Dar, odată ce vă obișnuiți cu ele, veți aprecia concisitatea lor.

Rețineți că multe comenzi de tip Unix, inclusiv cele din GNU și BSD, afișează informații succinte de ajutor dacă le invocați într-unul din următoarele moduri (sau fără argumente, în unele cazuri).

    $ commandname --help
    $ commandname -h

## 1.5. Comanda simplă de shell

Acum aveți o idee despre cum se utilizează sistemul Debian. Să analizăm în detaliu mecanismul de execuție a comenzilor în sistemul Debian. Aici, am simplificat realitatea pentru începători. Consultați bash(1) pentru explicații exacte.

O comandă simplă este o secvență de componente.

1. Atribuiri de variabile (opțional)

2. Numele comenzii

3. Argumente (opțional)

4. Redirecționări (opțional: `>` , `>>` , `<` , `<<` , etc.)

5. Operator de control (opțional: `&&` , `||` , newline , `;` , `&` , `(` , `)` )

### 1.5.1. Executarea comenzilor și variabilele de mediu

Valorile unor variabile de mediu modifică comportamentul unor comenzi Unix.

Valorile implicite ale variabilelor de mediu sunt stabilite inițial de sistemul PAM, iar unele dintre ele pot fi reajustate de anumite programe aplicaționale.

- Sistemul PAM, cum ar fi `pam_env`, poate defini variabile de mediu prin `/etc/pam.conf`„, ”`/etc/environment`„ și ”`/etc/default/locale`".

- Mediul grafic modern de birou, rulat din unitatea systemd din modul utilizator (a se vedea systemd.unit(5)), își configurează variabilele de mediu printr-un fișier din directorul „`~/.config/environment.d/`”.

- Inițializarea programului specific utilizatorului poate redefini variabilele de mediu prin „`~/.profile`”, „`~/.bash_profile`” și „`~/.bashrc`”.

### 1.5.2. Variabila „`$LANG`”

Configurația regională implicită este definită în variabila de mediu „`$LANG`” și este configurată ca „`LANG=xx_YY.UTF-8`” de către programul de instalare sau de către configurația ulterioară a interfeței grafice, de exemplu, „Configurări” → „Regiune și limbă” → „Limbă” / „Formate” pentru GNOME.

| Notă
Vă recomand să configurați mediul de sistem doar cu variabila „`$LANG`” pentru moment și să evitați variabilele „`$LC_*`”, cu excepția cazului în care este absolut necesar.

Valoarea completă a configurației regionale atribuită variabilei „`$LANG`” este formată din 3 părți: „`xx_YY.ZZZZ`”.

Tabel 1.18. Cele 3 părți ale valorii configurației regionale

valoarea configurației regionale | semnificație
--- | ---
`xx` | codurile de limbă ISO 639 (cu litere mici), cum ar fi „ro”
`YY` | codurile de țară ISO 3166 (majuscule), cum ar fi „RO”
`ZZZZ` | codificarea setului de caractere, definită întotdeauna la „UTF-8”

Tabel 1.19. Lista recomandărilor privind configurația regională

recomandare configurație regională | limba (zona teritorială)
--- | ---
`en_US.UTF-8` | engleză (SUA)
`en_GB.UTF-8` | engleză (Marea Britanie)
`fr_FR.UTF-8` | franceză (Franța)
`de_DE.UTF-8` | germană (Germania)
`it_IT.UTF-8` | italiană (Italia)
`es_ES.UTF-8` | spaniolă (Spania)
`ca_ES.UTF-8` | catalană (Spania)
`sv_SE.UTF-8` | suedeză (Suedia)
`pt_BR.UTF-8` | portugheză (Brazilia)
`ru_RU.UTF-8` | rusă (Rusia)
`zh_CN.UTF-8` | chineză (R.P. Chiina)
`zh_TW.UTF-8` | chineză (Taiwan)
`ja_JP.UTF-8` | japoneză (Japonia)
`ko_KR.UTF-8` | coreeană (Republica Coreea)
`vi_VN.UTF-8` | vietnameză (Vietnam)

Executarea tipică a comenzii utilizează o secvență de linii shell, după cum urmează.

    $ echo $LANG
    en_US.UTF-8
    $ date -u
    Wed 19 May 2021 03:18:43 PM UTC
    $ LANG=fr_FR.UTF-8 date -u
    mer. 19 mai 2021 15:19:02 UTC

Aici, programul date(1) este executat cu valori de configurație regională diferite.

- Pentru prima comandă, „`$LANG`” este definită la valoarea implicită a sistemului pentru configurația regională „`en_US.UTF-8`”.

- Pentru a doua comandă, „`$LANG`” este definită la valoarea configurației regionale franceze UTF-8 „`fr_FR.UTF-8`”.

Majoritatea execuțiilor de comenzi nu au, de obicei, o definiție a variabilei de mediu precedentă. Pentru exemplul de mai sus, puteți executa alternativ următoarele.

    $ LANG=fr_FR.UTF-8
    $ date -u
    mer. 19 mai 2021 15:19:24 UTC

| Indicație
Când raportați o eroare, este recomandat să rulați și să verificați comanda în configurația regională „`en_US.UTF-8`” dacă utilizați un mediu non-englez.

Pentru detalii precise privind configurarea parametrilor configurației regionale, consultați Secțiune 8.1, „Configurația regională”.

### 1.5.3. Variabila „`$PATH`”

Când introduceți o comandă în shell, shell-ul caută comanda în lista de directoare conținute în variabila de mediu „`$PATH`”. Valoarea variabilei de mediu „`$PATH`” este denumită și ruta de căutare a shell-ului.

În instalarea implicită Debian, variabila de mediu „`$PATH`” a conturilor de utilizator poate să nu includă „`/usr/sbin`” și „`/usr/sbin`”. De exemplu, comanda `ifconfig` trebuie emisă cu ruta completă „`/usr/sbin/ifconfig`”; (comanda similară `ip` se află în „`/usr/bin`”).

Puteți modifica variabila de mediu „`$PATH`” a shell-ului Bash prin fișierele „`~/.bash_profile`” sau „`~/.bashrc`”.

### 1.5.4. Variabila „`$HOME`”

Multe comenzi stochează configurația specifică utilizatorului în directorul personal al acestuia și modifică comportamentul acestora în funcție de conținutul lor. Directorul personal este identificat de variabila de mediu „`$HOME`”.

Tabel 1.20. Lista valorilor variabilei „`$HOME`”

valoarea variabilei „`$HOME`” | situația execuției programului
--- | ---
`/` | programul este rulat de procesul init (demon)
`/root` | programul rulează din shell-ul root normal
`/home/normal_user` | programul rulează din shell-ul utilizatorului normal
`/home/normal_user` | programul rulează din meniul mediului grafic de birou al utilizatorului normal
`/home/normal_user` | programul rulează ca root cu «`sudo program`»
`/root` | programul rulează ca root cu «`sudo -H program`»

| Indicație
Shell-ul extinde „`~/`” la directorul personal al utilizatorului curent, adică „`$HOME/`”. Shell-ul extinde „`~foo/`” la directorul personal al lui `foo`, adică „`/home/foo/`”.

Consultați Secțiune 12.1.5, „Variabilele de mediu ale shell” dacă `$HOME` nu este disponibil pentru programul dvs.

### 1.5.5. Opțiuni în linia de comandă

Unele comenzi acceptă argumente. Argumentele care încep cu „`-`” sau „`--`” sunt numite opțiuni și controlează comportamentul comenzii.

    $ date
    Thu 20 May 2021 01:08:08 AM JST
    $ date -R
    Thu, 20 May 2021 01:08:12 +0900

Aici, argumentul liniei de comandă „`-R`” modifică comportamentul date(1) pentru a genera un șir de caractere compatibil cu RFC2822.

### 1.5.6. Facilitatea glob a shell-ului

Adesea, doriți ca o comandă să funcționeze cu un grup de fișiere fără a le introduce pe toate. Modelul de extindere a numelor de fișiere utilizând facilitatea glob a shell-ului (denumită uneori wildcards) facilitează această necesitate.

Tabel 1.21. Modele globale shell

modele globale shell | descrierea regulii de potrivire
--- | ---
`*` | numele fișierului (segment) nu începe cu „`.`”
`.*` | numele fișierului (segmentul) a început cu „`.`” (în Bash 5.2 și versiunile ulterioare, „`.`” și „`..`” sunt excluse în mod implicit)
`?` | exact un caracter
`[…]` | exact un caracter cu orice caracter între paranteze
`[a-z]` | exact un caracter cu orice caracter între „`a`” și „`z`”
`[^…]` | exact un caracter, altul decât orice caracter inclus între paranteze (cu excepția „`^`”)

De exemplu, încercați următoarele

    $ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt
    $ echo *.txt
    1.txt 2.txt
    $ echo *
    1.txt 2.txt 3.c 4.h
    $ echo *.[hc]
    3.c 4.h
    $ echo .*
    .5.txt ..6.txt
    $ echo .*[^.]*
    .5.txt ..6.txt
    $ echo [^1-3]*
    4.h
    $ cd ..; rm -rf junk

A se vedea glob(7).

| Notă
Spre deosebire de extinderea normală a numelor de fișiere de către shell, modelul shell „`*`” testat în find(1) cu testul „`-name`” etc., se potrivește cu „`.`” inițial al numelui fișierului; (noua caracteristică POSIX).

| Notă
BASH poate fi modificat pentru a-i schimba comportamentul glob cu opțiunile sale încorporate shopt, cum ar fi „`dotglob`”, „`noglob`”, „`nocaseglob`”, „`nullglob`”, „`extglob`” etc. Consultați bash(1).

### 1.5.7. Valoarea returnată de comandă

Fiecare comandă returnează starea sa de ieșire (variabila: „`$?`”) ca valoare de returnare.

Tabel 1.22. Coduri de ieșire ale comenzii

starea de ieșire a comenzii | valoare numerică returnată | valoarea logică returnată
--- | --- | ---
succes | zero, 0 | TRUE
eroare | diferită de zero, -1 | FALSE

De exemplu, încercați următoarele.

    $ [ 1 = 1 ] ; echo $?
    0
    $ [ 1 = 2 ] ; echo $?
    1

| Notă
Vă rugăm să rețineți că, în contextul logic pentru shell, succesul este tratat ca TRUE logic, care are valoarea 0 (zero). Acest lucru este oarecum neintuitiv și trebuie reamintit aici.

### 1.5.8. Secvențe tipice de comenzi și redirecționarea shell-ului

Să încercăm să reținem următoarele expresii ale comenzii shell tastate într-o singură linie ca parte a comenzii shell.

Tabel 1.23. Expresii idiomatice ale comenzii shell

expresia idiomatică a comenzii | descriere
--- | ---
`command &` | execuție în fundal a `comenzii` în subshell
`command1 | command2` | redirecționează ieșirea standard a `comenzii1` către intrarea standard a `comenzii2` (execuție concomitentă)
`command1 2>&1 | command2` | redirecționează atât ieșirea standard, cât și eroarea standard a `comenzii1` către intrarea standard a `comenzii2` (execuție concomitentă)
`command1 ; command2` | execută `comanda1` și `comanda2` secvențial
`command1 && command2` | execută `comanda1`; dacă are succes, execută `comanda2` secvențial (returnează succes dacă atât `comanda1` cât și `comanda2` au succes)
`command1 || command2` | execută `comanda1`; dacă nu are succes, execută `comanda2` secvențial (returnează succes dacă `comanda1` sau `comanda2` au succes)
`command > foo` | redirecționează ieșirea standard a comenzii `comanda` către un fișier `foo` (suprascrie)
`command 2> foo` | redirecționează ieșirea de eroare standard a comenzii `comanda` către un fișier `foo` (suprascrie)
`command >> foo` | redirecționează ieșirea standard a comenzii `comanda` către un fișier `foo` (adăugare)
`command 2>> foo` | redirecționează ieșirea de eroare standard a comenzii `command` către un fișier `foo` (adăugare)
`command > foo 2>&1` | redirecționează atât ieșirea standard, cât și ieșirea de eroare standard a comenzii `comanda` către un fișier `foo`
`command < foo` | redirecționează intrarea standard a comenzii `comanda` către un fișier `foo`
`command << delimiter` | redirecționează intrarea standard a comenzii `comanda` către următoarele linii până când se întâlnește „`delimitatorul`” (aici, document)
`command <<- delimiter` | redirecționează intrarea standard a comenzii `comanda` către următoarele linii până când se întâlnește „`delimitatorul`” (aici document, caracterele de tabulare din fața liniilor de intrare sunt eliminate)

Sistemul Debian este un sistem multi-sarcini. Sarcinile de fundal permit utilizatorilor să ruleze mai multe programe într-un singur shell. Gestionarea proceselor în fundal implică utilizarea comenzilor încorporate ale shell-ului: `jobs`, `fg`, `bg` și `kill`. Vă rugăm să citiți secțiunile din bash(1) sub „SEMNALE” și „CONTROLUL SARCINILOR” și builtins(1).

De exemplu, încercați următoarele

    $ </etc/motd pager

    $ pager </etc/motd

    $ pager /etc/motd

    $ cat /etc/motd | pager

Deși toate cele 4 exemple de redirecționări shell afișează același lucru, ultimul exemplu execută o comandă suplimentară `cat` și irosește resurse fără niciun motiv.

Shell-ul vă permite să deschideți fișiere folosind comanda internă `exec` cu un descriptor de fișier arbitrar.

    $ echo Hello >foo
    $ exec 3<foo 4>bar  # open files
    $ cat <&3 >&4       # redirect stdin to 3, stdout to 4
    $ exec 3<&- 4>&-    # close files
    $ cat bar
    Hello

Descriptorii de fișiere 0-2 sunt predefiniți.

Tabel 1.24. Descriptori de fișiere predefiniți

dispozitiv | descriere | descriptor de fișier
--- | --- | ---
`stdin` | intrarea standard | 0
`stdout` | ieșirea standard | 1
`stderr` | ieșirea de eroare standard | 2

### 1.5.9. Alias de comandă

Puteți defini un alias pentru comanda utilizată frecvent.

De exemplu, încercați următoarele

    $ alias la='ls -la'

Acum, «`la`» funcționează ca o prescurtare pentru «`ls -la`», care listează toate fișierele în formatul de listare lungă.

Puteți lista orice alias existente prin `alias` (consultați bash(1) la «COMENZILE INTERNE ALE SHELL-ului»).

    $ alias
    ...
    alias la='ls -la'

Puteți identifica ruta exactă sau identitatea comenzii prin `type` (consultați bash(1) la «COMENZILE INTERNE ALE SHELL-ului»).

De exemplu, încercați următoarele

    $ type ls
    ls is hashed (/bin/ls)
    $ type la
    la is aliased to ls -la
    $ type echo
    echo is a shell builtin
    $ type file
    file is /usr/bin/file

Aici, «`ls`» a fost căutat recent, în timp ce «`file`» nu a fost, astfel încât «`ls`» este indexat, adică shell-ul are o înregistrare internă pentru accesul rapid la locația comenzii «`ls`».

| Indicație
A se vedea Secțiune 9.3.6, „Comenzi colorate”.

## 1.6. Procesarea textului în stilul Unix

În mediul de lucru de tip Unix, procesarea textului se realizează prin transferul textului prin intermediul unor lanțuri de instrumente standard de procesare a textului. Aceasta a fost o altă inovație crucială a sistemului Unix.

### 1.6.1. Instrumente pentru text în Unix

Există câteva instrumente standard de procesare a textului care sunt utilizate foarte des în sistemele de tip Unix.

- Nu se utilizează nicio expresie regulată:

  - cat(1) concatenează fișiere și afișează întregul conținut.

  - tac(1) concatenează fișierele și le afișează în ordine inversă.

  - cut(1) selectează părți din linii și le afișează.

  - head(1) afișează prima parte a fișierelor.

  - tail(1) afișează ultima parte a fișierelor.

  - sort(1) sortează liniile din fișierele text.

  - uniq(1) elimină liniile duplicate dintr-un fișier sortat.

  - tr(1) traduce sau șterge caractere.

  - diff(1) compară fișierele linie cu linie.

- Expresia regulată de bază („Basic regular expression”: BRE) este utilizată în mod implicit:

  - ed(1) este un editor de linii primitiv.

  - sed(1) este un editor de flux.

  - grep(1) potrivește textul cu modelele.

  - vim(1) este un editor de ecran.

  - emacs(1) este un editor de ecran. (oarecum extins cu BRE)

- Se utilizează expresia regulată extinsă („Extended regular expression”: ERE):

  - awk(1) efectuează procesarea simplă a textului.

  - egrep(1) potrivește textul cu modelele.

  - `tcl`(3tcl) poate efectua orice operație de procesare a textului: consultați re_syntax(3). Se utilizează adesea împreună cu `tk`(3tk).

  - perl(1) poate efectua orice operație de procesare a textului imaginabilă. Consultați perlre(1).

  - pcre2grep(1) din pachetul `pcre2-util` potrivește textul cu modelul Perl Compatible Regular Expressions (PCRE).

  - python(1) cu modulul `re` poate efectua orice procesare de text imaginabilă. Consultați „`/usr/share/doc/python/html/index.html`”.

Dacă nu sunteți sigur ce fac exact aceste comenzi, vă rugăm să utilizați «`man comanda`» pentru a afla singur.

| Notă
Ordinea de sortare și expresia intervalului depind de configurația regională. Dacă doriți să obțineți comportamentul tradițional pentru o comandă, utilizați parametrul de configurare regională C sau C.UTF-8 în locul celor normale UTF-8 (consultați Secțiune 8.1, „Configurația regională”).

| Notă
Expresiile regulate Perl(perlre(1)), Expresii regulate compatibile cu Perl („Perl Compatible Regular Expressions”: PCRE) și expresiile regulate Python oferite de modulul `re` au multe extensii comune cu ERE normal.

### 1.6.2. Expresii regulate

Expresiile regulate sunt utilizate în multe instrumente de procesare a textului. Acestea sunt similare cu modelele globale din shell, dar sunt mai complicate și mai puternice.

Expresia regulată descrie modelul de potrivire și este alcătuită din caractere text și metacaractere.

Un metacaracter este doar un caracter cu o semnificație specială. Există două stiluri principale, „Basic Regular Expressions”: BRE (expresii regulate de bază) și „Extended Regular Expressions”: ERE (expresii regulate extinse), în funcție de instrumentele de text descrise mai sus.

Tabel 1.25. Metacaractere pentru BRE și ERE

BRE | ERE | descrierea expresiei regulate
--- | --- | ---
`\ . [ ] ^ $ *` | `\ . [ ] ^ $ *` | metacaractere comune
`\+ \? \( \) \{ \} \|` |  | doar în BRE, metacaractere eludate „`\`”
| `+ ? ( ) { } |` | doar în ERE, metacaractere fără caracterul de eludare „`\`”
`c` | `c` | potrivește cu un non-metacaracter „`c`”
`\c` | `\c` | potrivește un caracter literal „`c`” chiar dacă „`c`” este de fapt un metacaracter
`.` | `.` | potrivește orice caracter, inclusiv cel de linie nouă
`^` | `^` | poziția la începutul unui șir de caractere
`$` | `$` | poziția la sfârșitul unui șir de caractere
`\<` | `\<` | poziția la începutul unui cuvânt
`\>` | `\>` | poziția la sfârșitul unui cuvânt
`[abc…]` | `[abc…]` | potrivește orice caractere din „`abc…`”
`[^abc…]` | `[^abc…]` | potrivește orice caractere, cu excepția celor din „`abc…`”
`r*` | `r*` | potrivește zero sau mai multe expresii regulate identificate prin „`r`”
`r\+` | `r+` | potrivește una sau mai multe expresii regulate identificate prin „`r`”
`r\?` | `r?` | potrivește zero sau o expresie regulată identificată prin „`r`”
`r1\|r2` | `r1|r2` | potrivește una dintre expresiile regulate identificate prin „`r1`” sau „`r2`”
`\(r1\|r2\)` | `(r1|r2)` | potrivește una dintre expresiile regulate identificate prin „`r1`” sau „`r2`” și o tratează ca o expresie regulată încadrată între paranteze

Expresia regulată `emacs` este în esență BRE, dar a fost extinsă pentru a trata „`+`” și „`?`” ca metacaractere ca în ERE. Astfel, nu este necesar să le eludați cu „`\`” în expresia regulată a `emacs`.

grep(1) poate fi utilizat pentru a efectua căutarea textului folosind o expresie regulată.

De exemplu, încercați următoarele

    $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
    GNU GENERAL PUBLIC LICENSE
    GNU GENERAL PUBLIC LICENSE
    Yoyodyne, Inc., hereby disclaims all copyright interest in the program

| Indicație
A se vedea Secțiune 9.3.6, „Comenzi colorate”.

### 1.6.3. Expresii de înlocuire

Pentru expresia de înlocuire, unele caractere au semnificații speciale.

Tabel 1.26. Expresia de înlocuire

expresie de înlocuire | descrierea textului care va înlocui expresia de înlocuire
--- | ---
`&` | ceea ce a fost găsit de expresia regulată (utilizați `\&` în `emacs`)
`\n` | cu ce s-a potrivit a n-a expresie regulată între paranteze (unde „n” este un număr)

Pentru înlocuirea șirurilor în Perl, se utilizează „$&” în loc de „&” și „$n” în loc de „\n”.

De exemplu, încercați următoarele

    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=$&=/'
    zzz=1abc2efg3hij4=
    $ echo zzz1abc2efg3hij4 | \
    sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    sed -E -e 's/(1[a-z]*)[0-9]*(.*)$/\2===\1/'
    zzzefg3hij4===1abc
    $ echo zzz1abc2efg3hij4 | \
    perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
    zzzefg3hij4===1abc

Aici, vă rugăm să acordați o atenție deosebită stilului expresiei regulate în paranteze și modului în care șirurile potrivite sunt utilizate în procesul de înlocuire a textului în diferite instrumente.

Aceste expresii regulate pot fi utilizate și pentru mișcările cursorului și acțiunile de înlocuire a textului în unele editoare.

Bară oblică inversă „`\`” la sfârșitul liniei în linia de comandă a shell-ului eludează caracterul de linie nouă ca caracter spațiu alb și continuă introducerea liniei de comandă a shell-ului în linia următoare.

Vă rugăm să citiți toate paginile de manual aferente pentru a învăța aceste comenzi.

### 1.6.4. Înlocuire globală cu expresii regulate

Comanda ed(1) poate înlocui toate aparițiile „`FROM_REGEX`” cu „`TO_TEXT`” în „`file`”.

    $ ed file <<EOF
    ,s/FROM_REGEX/TO_TEXT/g
    w
    q
    EOF

Comanda sed(1) poate înlocui toate aparițiile „`FROM_REGEX`” cu „`TO_TEXT`” în „`file`”.

    $ sed -i -e 's/FROM_REGEX/TO_TEXT/g' file

Comanda vim(1) poate înlocui toate aparițiile „`FROM_REGEX`” cu „`TO_TEXT`” în „`file`” folosind comenzi ex(1).

    $ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+update' '+q' file

| Indicație
Indicatorul „`c`” din exemplul de mai sus asigură confirmarea interactivă pentru fiecare substituție.

Mai multe fișiere („`file1`”, „`file2`” și „`file3`”) pot fi procesate cu expresii regulate în mod similar cu vim(1) sau perl(1).

    $ vim '+argdo %s/FROM_REGEX/TO_TEXT/gce|update' '+q' file1 file2 file3

| Indicație
Indicatorul „`e`” din exemplul de mai sus împiedică eroarea „No match” (fără corespondență) să întrerupă o căutare.

    $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3

În exemplul perl(1), „`-i`” este pentru editarea pe loc (fără folosirea unui tampon/fișier temporal pentru aceasta) a fiecărui fișier țintă, iar „`-p`” este pentru bucla implicită peste toate fișierele date.

| Indicație
Utilizarea argumentului „`-i.bak`” în locul „`-i`” păstrează fiecare fișier original prin adăugarea „`.bak`” la numele fișierului. Acest lucru facilitează recuperarea în cazul erorilor pentru substituții complexe.

| Notă
ed(1) și vim(1) sunt BRE; perl(1) este ERE.

### 1.6.5. Extragerea datelor din tabelul fișierului text

Să luăm în considerare un fișier text numit „`DPL`” în care sunt enumerate numele unor lideri ai proiectului Debian dinainte de 2004 și data inițierii lor, într-un format separat prin spații.

    Ian     Murdock   August  1993
    Bruce   Perens    April   1996
    Ian     Jackson   January 1998
    Wichert Akkerman  January 1999
    Ben     Collins   April   2001
    Bdale   Garbee    April   2002
    Martin  Michlmayr March   2003

| Indicație
Consultați „O scurtă istorie a Debian” pentru cea mai recentă istorie a conducerii Debian.

Awk este frecvent utilizat pentru extragerea datelor din aceste tipuri de fișiere.

De exemplu, încercați următoarele

    $ awk '{ print $3 }' <DPL                   # month started
    August
    April
    January
    January
    April
    April
    March
    $ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
    Ian     Murdock   August  1993
    Ian     Jackson   January 1998
    $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
    April 1996

Shell-uri precum Bash pot fi, de asemenea, utilizate pentru a analiza acest tip de fișiere.

De exemplu, încercați următoarele

    $ while read first last month year; do
        echo $month
      done <DPL
    ... same output as the first Awk example

Aici, comanda internă `read` utilizează caracterele din „`$IFS`” („internal field separators” - separatoare interne de câmpuri) pentru a împărți liniile în cuvinte.

Dacă schimbați „`$IFS`” cu „`:`”, puteți analiza „`/etc/passwd`” cu shell-ul fără probleme.

    $ oldIFS="$IFS"   # save old value
    $ IFS=':'
    $ while read user password uid gid rest_of_line; do
        if [ "$user" = "bozo" ]; then
          echo "$user's ID is $uid"
        fi
      done < /etc/passwd
    bozo's ID is 1000
    $ IFS="$oldIFS"   # restore old value

(Dacă se utilizează Awk pentru a face același lucru, utilizați „`FS=':'`” pentru a defini separatorul de câmpuri.)

IFS este utilizat și de shell pentru a împărți rezultatele expansiunii parametrilor, substituției comenzilor și expansiunii aritmetice. Acestea nu apar în cuvintele între ghilimele duble sau simple. Valoarea implicită a IFS este spațiu, tabulator și linie nouă combinate.

Aveți grijă când utilizați aceste trucuri IFS ale shell-ului. Pot apărea lucruri ciudate atunci când shell-ul interpretează anumite părți ale scriptului ca fiind intrare.

    $ IFS=":,"                        # use ":" and "," as IFS
    $ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash builtin
    IFS=  , IFS=:,
    $ date -R                         # just a command output
    Sat, 23 Aug 2003 08:30:15 +0200
    $ echo $(date -R)                 # sub shell --> input to main shell
    Sat  23 Aug 2003 08 30 36 +0200
    $ unset IFS                       # reset IFS to the default
    $ echo $(date -R)
    Sat, 23 Aug 2003 08:30:50 +0200

### 1.6.6. Fragmente de script pentru comenzi de direcționare

Următoarele scripturi fac lucruri interesante ca parte a unei conducte (direcționări).

Tabel 1.27. Lista fragmentelor de script pentru comenzi de direcționare

fragment de script (introduceți într-o singură linie) | efectul comenzii
--- | ---
`find /usr -print` | găsește toate fișierele din „`/usr`”
`seq 1 100` | imprimă numere de la 1 până la 100
`| xargs -n 1 command` | rulează comanda în mod repetat cu fiecare element din conductă ca argument al său
`| xargs -n 1 echo` | împarte elementele separate prin spații albe din conductă în linii
`| xargs echo` | fuzionează toate liniile din conductă într-o singură linie
`| grep -e regex_pattern` | extrage linii din conductă care conțin model_expresie-regulată
`| grep -v -e regex_pattern` | extrage liniile din conductă care nu conțin model_expresie-regulată
`| cut -d: -f3 -` | extrage al treilea câmp din conductă separat prin „`:`” (fișier passwd etc.)
`| awk '{ print $3 }'` | extrage al treilea câmp din șirul separat prin spații
`| awk -F'\t' '{ print $3 }'` | extrage al treilea câmp din șirul separat prin tabulator
`| col -bx` | elimină „backspace” (retururile de cărucior) și transformă tabulatoarele în spații
`| expand -` | transformă tabulatoarele în spații
`| sort| uniq` | sortează și elimină duplicatele
`| tr 'A-Z' 'a-z'` | convertește majusculele în minuscule
`| tr -d '\n'` | concatenează liniile într-o singură linie
`| tr -d '\r'` | elimină CR (retururile de cărucior)
`| sed 's/^/# /'` | adaugă „`#`” la începutul fiecărei linii
`| sed 's/\.ext//g'` | elimină „`.ext`”
`| sed -n -e 2p` | imprimă a doua linie
`| head -n 2 -` | imprimă primele 2 linii
`| tail -n 2 -` | imprimă ultimele 2 linii

Un script shell de o singură linie poate parcurge mai multe fișiere folosind find(1) și xargs(1) pentru a efectua sarcini destul de complicate. Vedeți Secțiune 10.1.5, „Expresii idiomatice pentru selectarea fișierelor” și Secțiune 9.4.9, „Repetarea unei comenzi care parcurge fișierele”.

Când utilizarea modului interactiv al shell-ului devine prea complicată, luați în considerare scrierea unui script shell (consultați Secțiune 12.1, „Scriptul Shell”).

[1] Chiar și versiunea mai veche `vim` poate porni în modul „`nocompatible`” prin opțiunea „`-N`”.

Prefață |  | Cap. 2. Gestionarea pachetelor Debian