În sistemul Linux, shell-ul păstrează o evidență a comenzilor pe care le executați, oferindu-vă posibilitatea de a le căuta și repeta. Înțelegerea funcționalității și utilizării comenzii `history` poate crește considerabil eficiența muncii dumneavoastră.
Gestionarea Istoricului
Așa cum spunea George Santayana, „Cei care nu-și amintesc trecutul sunt condamnați să-l repete.” În contextul Linux, lipsa memoriei comenzilor anterioare poate însemna imposibilitatea de a le reutiliza, chiar dacă acest lucru ar fi util.
Aici intervine comanda `history`. Ea vă permite să consultați și să executați din nou comenzile introduse anterior. Aceasta nu este doar o metodă de a economisi timp, ci și o măsură de eficiență și acuratețe. Cu cât o comandă este mai lungă și complexă, cu atât este mai dificil să o rețineți și să o tastați corect. Erorile pot apărea sub două forme: una care împiedică executarea comenzii și alta care permite funcționarea, dar cu rezultate neașteptate.
Comanda `history` elimină aceste riscuri. Asemenea multor comenzi Linux, oferă mai multe funcționalități decât s-ar crede inițial. Investiția în înțelegerea acestei comenzi poate îmbunătăți considerabil experiența dumneavoastră cu linia de comandă Linux. Există metode mai eficiente de a utiliza istoricul comenzilor decât navigarea repetată cu săgeata sus.
Utilizarea Comenzii `history`
Cea mai simplă formă de utilizare a comenzii `history` este tastarea ei direct în terminal:
history
Aceasta va afișa o listă a comenzilor executate anterior în fereastra terminalului.

Comenzile sunt numerotate, cele mai recente având numerele mai mari, fiind plasate la sfârșitul listei.
Pentru a vedea un număr specific de comenzi, puteți specifica acest număr ca argument al comenzii. De exemplu, pentru a vizualiza ultimele 10 comenzi, folosiți:
history 10

Același rezultat poate fi obținut prin combinarea comenzii `history` cu comanda `tail`:
history | tail -n 10

Repetarea Comenzilor
Pentru a reutiliza o comandă din istoric, introduceți un semn de exclamare (!) urmat de numărul comenzii, fără spații.
De exemplu, pentru a executa din nou comanda numărul 37, tastați:
!37

Pentru a repeta ultima comandă, utilizați două semne de exclamare, tot fără spații:
!!

Această tehnică este utilă când uitați să folosiți `sudo` la executarea unei comenzi. Puteți tasta `sudo` urmat de un spațiu și `!!`, apoi apăsați Enter.
Să presupunem că ați lansat o comandă care necesită privilegii de administrator. În loc să reintroduceți întreaga linie de comandă, puteți economisi timp tastând `sudo !!`, ca în exemplul următor:
mv ./my_script.sh /usr/local/bin/
sudo !!

Așadar, puteți repeta o comandă specificând numărul ei sau utiliza `!!` pentru ultima comandă. Dar, ce faceți dacă doriți să repetați a cincea sau a opta comandă anterioară?
Puteți utiliza un semn de exclamare, o liniuță (-) și numărul comenzii anterioare (fără spații) pentru a o executa din nou.
Pentru a repeta a 13-a comandă anterioară, tastați:
!-13

Căutarea Comenzilor După Șir
Pentru a repeta ultima comandă care începe cu un anumit șir, tastați un semn de exclamare urmat de șir, fără spații, și apăsați Enter.
De exemplu, pentru a repeta ultima comandă care a început cu `sudo`, folosiți:
!sudo

Există însă un risc. Dacă ultima comandă care a început cu `sudo` nu este cea pe care o așteptați, veți lansa o comandă greșită.
Pentru a evita această situație, puteți folosi modificatorul `:p` (print), astfel:
!sudo:p

Aceasta va afișa comanda în terminal, fără a o executa. Astfel, puteți verifica comanda înainte de a o lansa. Dacă este corectă, apăsați săgeata în sus și Enter pentru a o executa.
Dacă doriți să găsiți o comandă care conține un anumit șir, utilizați un semn de exclamare și un semn de întrebare.
De exemplu, pentru a găsi și executa prima comandă care conține cuvântul „aliases”, folosiți:
!?aliases

Aceasta va localiza orice comandă care conține șirul „aliases”, indiferent de poziția sa în comandă.
Căutarea Interactivă
Căutarea interactivă vă permite să parcurgeți o listă de comenzi potrivite și să o repetați pe cea dorită.
Apăsați Ctrl+r pentru a începe căutarea.

Pe măsură ce introduceți termenul de căutare, va apărea prima comandă potrivită. Literele introduse vor fi afișate între apostrofele ` și ‘. Comenzile potrivite se vor actualiza pe măsură ce tastați.

Apăsând Ctrl+r în mod repetat, veți naviga la următoarele comenzi care corespund criteriului de căutare.

Când apăsați Enter, comanda afișată va fi executată.

Pentru a edita comanda înainte de execuție, apăsați tasta săgeată stânga sau dreapta.

Comanda va apărea pe linia de comandă, fiind acum editabilă.

Puteți utiliza și alte instrumente Linux pentru a căuta în istoric. De exemplu, pentru a redirecționa ieșirea comenzii `history` către `grep` și căuta comenzile care conțin șirul „aliases”, folosiți:
history | grep aliases

Modificarea Ultimei Comenzi
Dacă trebuie să corectați o greșeală de tastare și să repetați comanda, puteți utiliza caracterul circumflex (^) pentru a o modifica. Este o metodă utilă atunci când ați scris greșit o comandă sau doriți să o executați din nou cu o opțiune sau un parametru diferit.
Pentru a o utiliza, tastați (fără spații) un circumflex, textul pe care doriți să-l înlocuiți, un alt circumflex, textul cu care doriți să-l înlocuiți, și un ultim circumflex, apoi apăsați Enter.
De exemplu, să presupunem că ați tastat accidental `shhd` în loc de `sshd` în următoarea comandă:
sudo systemctl start shhd
Puteți corecta greșeala tastând:
^shhd^sshd^

Comanda va fi executată cu `shhd` corectat la `sshd`.
Ștergerea Comenzilor Din Istoric
Puteți șterge comenzi din istoric cu opțiunea `-d` (delete). Nu este necesar să păstrați comenzile greșite în istoric.
Puteți folosi `grep` pentru a găsi o comandă, apoi utilizați numărul acesteia împreună cu opțiunea `-d` pentru a o șterge. Ulterior, puteți căuta din nou pentru a verifica dacă a dispărut:
history | grep shhd
history -d 83
history | grep shhd

De asemenea, puteți oferi un interval de comenzi opțiunii `-d`. Pentru a șterge toate intrările din istoric de la 22 la 32 (inclusiv), folosiți:
history -d 22 32
Pentru a șterge doar ultimele cinci comenzi, introduceți un număr negativ:
history -d -5
Actualizarea Manuală a Fișierului Istoric
Când vă conectați sau deschideți o sesiune de terminal, istoricul comenzilor este încărcat din fișierul său. În Bash, fișierul implicit este `.bash_history`.
Modificările efectuate în sesiunea curentă sunt scrise în fișierul istoric abia când închideți fereastra terminalului sau vă deconectați.
Să presupunem că doriți să deschideți o altă fereastră de terminal și să accesați istoricul complet, inclusiv comenzile din prima fereastră. Opțiunea `-a` (all) vă permite să faceți acest lucru în prima fereastră, înainte de a o deschide pe a doua.
Pentru a o utiliza, tastați:
history -a

Comenzile sunt scrise silențios în fișierul istoric.
Dacă doriți să scrieți toate modificările din istoric în fișier (de exemplu, dacă ați șters comenzi vechi), puteți utiliza opțiunea `-w` (write):
history -w

Ștergerea Întregului Istoric
Pentru a șterge toate comenzile din istoric, folosiți opțiunea `-c` (clear):
history -c

Pentru a forța aceste modificări în fișierul istoric, utilizați și opțiunea `-w`:
history -w
Securitatea și Fișierul Istoric
Dacă folosiți aplicații care cer informații sensibile (cum ar fi parolele) în linia de comandă, rețineți că acestea vor fi salvate în istoric. Dacă doriți să evitați salvarea anumitor informații, folosiți următoarea structură de comandă pentru a le șterge imediat din istoric:
special-app my-secret-password;history -d $(history 1)
history 5

Această structură include două comenzi separate printr-un punct și virgulă (;). Explicație:
- `special-app`: Numele programului folosit.
- `my-secret-password`: Parola introdusă pentru aplicație în linia de comandă. Aceasta este sfârșitul primei comenzi.
- `history -d`: În a doua comandă, invocăm opțiunea `-d` (ștergere) a comenzii `history`. Ceea ce vom șterge vine în următoarea parte a comenzii.
- `$(history 1)`: Aici utilizăm substituția de comandă. Porțiunea comenzii inclusă în `$(…)` este executată într-un subshell. Rezultatul acestei execuții este inserat ca text în comanda originală. Comanda `history 1` returnează comanda anterioară. Deci, a doua comandă devine `history -d „ultima comandă aici”`.
Puteți folosi `history 5` pentru a confirma că parola a fost eliminată din istoric.
O metodă și mai simplă este să includeți un spațiu la începutul liniei, deoarece Bash ignoră în mod implicit liniile care încep cu un spațiu:
special-app another-password
history 5

Comanda cu parola nu va fi adăugată în istoric. Această tehnică funcționează datorită conținutului fișierului `.bashrc`.
Fișierul `.bashrc`
Fișierul `.bashrc` este executat de fiecare dată când vă conectați sau deschideți o fereastră de terminal. El conține și câteva setări care controlează comportamentul comenzii `history`. Vom edita acest fișier folosind `gedit`.
Introduceți:
gedit .bashrc

În partea superioară a fișierului veți găsi două intrări:
- `HISTSIZE`: Numărul maxim de intrări pe care istoricul le poate conține.
- `HISTFILESIZE`: Limita numărului de linii pe care fișierul istoric le poate conține.

Aceste două valori interacționează după cum urmează:
- Când vă conectați sau deschideți o sesiune de terminal, istoricul comenzilor este populat din fișierul `.bash_history`.
- Când închideți fereastra de terminal, numărul maxim de comenzi setat în `HISTSIZE` este salvat în fișierul `.bash_history`.
- Dacă opțiunea `histappend` este activată, comenzile sunt adăugate la `.bash_history`. În caz contrar, `.bash_history` este suprascris.
- După salvarea comenzilor din istoric în `.bash_history`, fișierul este trunchiat pentru a nu conține mai mult de `HISTFILESIZE` linii.
De asemenea, veți găsi o intrare pentru valoarea `HISTCONTROL`.

Puteți seta această valoare pentru a activa următoarele:
- `ignorespaces`: Liniile care încep cu un spațiu nu sunt adăugate la istoric.
- `ignoredups`: Comenzile duplicate nu sunt adăugate la fișierul istoric.
- `ignoreboth`: Activează ambele opțiuni de mai sus.
Puteți, de asemenea, să enumerați anumite comenzi pe care nu doriți să le salvați în istoric. Separați-le cu două puncte (:) și includeți-le între ghilimele („…”).
Urmați această structură pentru a adăuga o linie la fișierul `.bashrc` și pentru a înlocui comenzile pe care doriți să le ignorați:
export HISTIGNORE="ls:history"

Utilizarea Marcajelor Temporale
Dacă doriți să adăugați marcaje temporale la istoric, folosiți setarea `HISTIMEFORMAT`. Adăugați o linie ca aceasta în fișierul `.bashrc`:
export HISTTIMEFORMAT="%c "
Rețineți spațiul de la începutul ghilimelelor de închidere. Acesta previne ca marcajul temporal să fie lipit de comanda din listă.

Acum, când rulați `history`, veți vedea data și ora. Rețineți că toate comenzile care se aflau în istoric înainte de adăugarea marcajelor temporale vor fi etichetate cu data și ora primei comenzi care primește un marcaj temporal. În exemplul de mai jos, aceasta a fost comanda 118.

Acesta este un marcaj temporal destul de lung. Puteți utiliza și alte simboluri pentru a-l rafina:
- `%d`: Ziua
- `%m`: Luna
- `%y`: Anul
- `%H`: Ora
- `%M`: Minute
- `%S`: Secunde
- `%F`: Data completă (format an-lună-zi)
- `%T`: Ora (format oră:minute:secunde)
- `%c`: Marcajul complet de dată și oră (format zi-data-lună-an și oră:minute:secunde)
Să experimentăm cu diferite token-uri:
export HISTTIMEFORMAT="%d n%m %T "

Ieșirea va afișa ziua, luna și ora.

Dacă eliminăm ziua și luna, va fi afișată doar ora.
Orice modificare adusă `HISTIMEFORMAT` se va aplica întregului istoric. Acest lucru este posibil deoarece timpul fiecărei comenzi este stocat ca numărul de secunde din epoca Unix. Directiva `HISTTIMEFORMAT` specifică doar formatul folosit pentru a reda acel număr într-un format lizibil, de exemplu:
export HISTTIMEFORMAT="%T "

Acum, rezultatul este mai ușor de gestionat.
<img loading=”lazy” decoding=”async” src