Skip to content

Commit

Permalink
Add more flesh
Browse files Browse the repository at this point in the history
Signed-off-by: Eduard Staniloiu <[email protected]>
  • Loading branch information
edi33416 committed Aug 13, 2020
1 parent 04de942 commit f9e67ca
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 11 deletions.
Binary file added chapters/improve-cli/img/bash-history.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added chapters/improve-cli/img/tab-completion.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
179 changes: 168 additions & 11 deletions chapters/improve-cli/improve-terminal.rst
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Îmbunătățirea lucrului în linia de comandă
==========================================

Principalul atu al utilizării aplicațiilor în linie de comandă, și nu în mediul grafic, îl reprezintă viteza cu care rezolvăm anumite task-uri.
Principalul atu al utilizării aplicațiilor în linie de comandă, și nu în mediul grafic, îl reprezintă viteza cu care rezolvăm anumite sarcini.
Această viteză este dată de posibilitatea de a combina utilitare în linia de comandă pentru a automatiza procese manuale, repetitive.
Întotdeauna ne dorim să fim mai rapizi și să automatizăm cât mai mult din sarcinile noastre pentru că cu cât ne terminăm treaba mai repede, cu atât avem mai mult timp liber la dispoziție.
Întotdeauna ne dorim să fim mai rapizi și să automatizăm cât mai mult din sarcinile noastre deoarece cu cât ne terminăm treaba mai repede, cu atât avem mai mult timp liber la dispoziție.

De regulă, cu cât petrecem mai mult timp cu mâna pe tastatură și mai puțin pe mouse, cu atât suntem mai rapizi.
Aliniate la această idee, aplicațiile ne pun la dispoziție scurtături pe care suntem încurajați să le folosim pentru a ne utiliza timpul mai eficient.
Expand All @@ -24,13 +24,13 @@ Pentru a vedea scurtăturile disponibile la nivel de sistem, și pentru a defini
:alt: Vizualizarea și definirea scurtăturilor din sistem

Există scenarii în care folosirea unei singure instanțe de terminal nu este cel mai productiv mod de lucru.
Un astfel de scenariu este dat de dezvoltarea aplicațiilor, scenariu pe care îl putem sparge în trei componente (sub-taskuri): scrierea aplicației, compilarea aplicației și testarea aplicației.
Am putea să folosim un singur terminal pentru cele trei sub-taskuri, dar este de preferat să folosim câte un terminal pentru fiecare sub-task; astfel avem o separare logică mai clară.
Un astfel de scenariu este dat de dezvoltarea aplicațiilor, scenariu pe care îl putem sparge în trei componente (sub-task-uri): scrierea aplicației, compilarea aplicației și testarea aplicației.
Am putea să folosim un singur terminal pentru cele trei sub-task-uri, dar este de preferat să folosim câte un terminal pentru fiecare sub-task; astfel avem o separare logică mai clară.
Astfel, ferestrele din sistem vor arăta similar cu imaginea de mai jos:

.. image:: img/hello-multi-terms.png
:align: center
:alt: Separarea unui task în sub-taskuri per terminal
:alt: Separarea unui task în sub-task-uri per terminal

Am făcut un pas în direcția corectă, însă această abordare poate să ducă la o complexitate sporită a managementului ferestrelor: dacă am dezvolta în paralel două aplicații?
Am avea șase ferestre de terminal deschise, prin care trebuie să ciclăm.
Expand All @@ -41,15 +41,15 @@ Folosind scurtătura ``Ctrl+Shift+t`` vom deschide o instanță nouă de termina

.. image:: img/hello-multi-tabs.png
:align: center
:alt: Separarea unui task în sub-taskuri per tab
:alt: Separarea unui task în sub-task-uri per taskb

Acum structura este mai "curată" și am păstrat separarea logică: în primul tab vom scrie aplicația, în cel de-al doilea tab o vom compila și în ultimul tab (al treilea) o vom rula.
Acum structura este mai "curată" și am păstrat separarea logică: în primul tab vom scrie aplicația, în cel de-al doilea tab o vom compila și în ultimul tab (al treilea) o vom executa.

Separarea logică în fereastră per task și tab per sub-task este benefică atunci când vă ocupați concomitent de mai multe lucruri.

Deschideți două terminale în ferestre separate.
În fiecare fereastră deschideți un terminal într-un tab nou.
Puteți folosi exercițiile de la dezvoltarea aplicațiilor ca suport pentru spargerea în taskuri și sub-taskuri.
Puteți folosi exercițiile de la dezvoltarea aplicațiilor ca suport pentru spargerea în task-uri și sub-task-uri.

b. Navigarea între ferestre și taburi
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down Expand Up @@ -94,9 +94,166 @@ d. Sumar: Scurtături în cadrul sistemului de operare
2. Scurtături în terminal
-------------------------

* Navigat în interiorul unei comenzi (ctrl+a, ctrl+e, alt+f, alt+b), modificări (ctrl+k, ctrl+u, alt+d) și paste (ctrl+y)
* History + navigat în istoricul comenzilor: arrow_keys, reverse search (ctrl+r) și ciclat prin ultimul argument al comenzilor anterioare (alt+., !!). Modificat dimensiune istoric
a. Tab completion
^^^^^^^^^^^^^^^^^

Funcția de **tab completion** este probabil una dintre cele mai utile funcții expuse de către terminal.
Prin simpla apăsare a tastei ``Tab`` în timp ce scriem numele unei comenzi, al unei opțiuni a unei comenzi sau calea către un director sau fișier, terminalul va completa în mod automat textul sau va sugera opțiuni de auto-complete.

În imaginea de mai jos putem observa că pentru comanda ``cd D`` funcția de ``Tab`` completion a găsit mai multe opțiuni valide pentru auto-complete.
În astfel de scenarii, cu mai multe opțiuni valide, apăsarea tastei ``Tab`` o singură dată nu produce niciun rezultat; trebuie să apăsăm tasta ``Tab`` de două ori consecutiv pentru a genera afișarea opțiunilor de auto-complete.

.. image:: img/tab-completion.png
:align: center
:alt: Demo tab completion

Funcția de auto-complete este extrem de utilă și îmbunătățește în mod dramatic viteza cu care realizăm acțiuni în terminal.

Funcția este extrem de utilă atunci când lucrăm cu nume de fișiere, directoare și căi din sistem.
În loc să scriem manual o cale către un nume foarte lung, care poate implică și escaparea unor caractere speciale, lăsăm tasta ``Tab`` să facă asta pentru noi.

Un alt avantaj al folosirii tastei ``Tab`` este că atunci când aceasta nu produce nici un rezultat, este un indicator foarte bun că avem o eroare în comandă: am scris greșit o anumită parte din numele comenzii sau al fișierului, fișierul nu există, etc.

Folosiți funcția de ``Tab`` completion cât mai des cu putință.

b. Navigarea în istoricul unei comenzi
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Terminalul implementează funcția de a reține istoricul comenzilor pe care le-am executat.
Pentru a vedea istoricul curent putem rula comanda ``history``.
Vom obține un rezultat asemănător cu:

.. image:: img/bash-history.png
:align: center
:alt: Output of running the `history` command

Putem cicla prin comenzile date anterior folosind combinația de taste ``Arrow Up``, respectiv ``Arrow Down``.
Încercați.

Căutarea inversă în istoricul comenzilor
""""""""""""""""""""""""""""""""""""""""

Terminalul ne pune la dispoziție un mod mai inteligent de a căuta în istoricul comenzilor prin combinația de taste ``Ctrl+r``, ordinea căutării fiind de la cea mai recentă comandă la cea mai veche.
Funcția este cunoscută sub numele de **reverse search**.

Pentru a proni căutarea apăsați combinația de taste ``Ctrl+r`` și începeți să scrieți o parte din textul comenzii pe care o căutați, de exemplu ``cd``.

.. code-block:: bash
(reverse-i-search)`cd': cd workspace/hello
* Pentru a continua căutarea apăsați ``Ctrl+r``
* Pentru a rula comanda pe care ați găsit-o apăsați ``Ctrl+o``
* Pentru a anula căutarea și a reveni la starea inițială apăsați ``Ctrl+g``
Expandarea comenzilor anterioare
""""""""""""""""""""""""""""""""
Terminalul ne pune la dispoziție și alte moduri prin care putem reutiliza comenzile din istoric.
Am observat din rezultatul rulării comenzii ``history`` faptul că fiecare comandă din istoric este precedată de un număr:
.. code-block:: bash
23 ls -l
Acest număr funcționează ca un index pe care îl putem folosi pentru a executa comanda care îi corespunde:
.. code-block:: bash
student@uso:~$ !23
ls -l
total 60
drwxr-xr-x 2 student student 4096 aug 6 2018 Desktop
drwxr-xr-x 3 student student 4096 aug 20 2018 Documents
drwxr-xr-x 2 student student 4096 aug 11 19:35 Downloads
drwxr-xr-x 2 student student 4096 aug 6 2018 Music
drwxr-xr-x 2 student student 4096 aug 11 21:08 Pictures
drwxr-xr-x 2 student student 4096 aug 6 2018 Public
drwxr-xr-x 2 student student 4096 aug 6 2018 Templates
drwxr-xr-x 2 student student 4096 aug 6 2018 Videos
-rw-r--r-- 1 student student 8980 aug 6 2018 examples.desktop
drwxr-xr-x 14 student student 4096 aug 20 2018 uso.git
-rw-r--r-- 1 student student 4827 aug 21 2018 vm-actions-log.txt
drwxr-xr-x 3 student student 4096 aug 11 20:28 workspace
Observăm că ``!23`` a fost înlocuit (expandat, în abuz de limbaj) cu comanda ``ls -l`` care corespundea indexului **23**.
Un caz particular, foarte des folosit, este reprezentat de ``!!`` care se va înlocui textual cu ultima comandă executată:
.. code-block:: bash
student@uso:~$ ls
Desktop Downloads Pictures Templates examples.desktop vm-actions-log.txt
Documents Music Public Videos uso.git workspace
student@uso:~$ !! -l workspace
ls -l workspace
total 4
drwxr-xr-x 2 student student 4096 aug 11 21:32 hello
În exemplul de mai sus observăm că ``!!`` a fost înlocuit cu ``ls`` în textul comenzii, pentru ca apoi să se execute comanda ``ls -l workspace``.
Rulați trei comenzi din istoricul vostru folosind atât înlocuirea numerică (``!2``), cât și înlocuirea ultimei comenzi (``!!``).
Folosiți-vă de faptul că această înlocuire are loc înaintea executării comenzii pentru a adăuga argumente comenzilor, similar cum am făcut în exemplul de mai sus.
Reutilizarea argumentelor comenzii anterioare
"""""""""""""""""""""""""""""""""""""""""""""""
Terminalul ne oferă și o sintaxă prin care avem posibilitatea de a reutiliza argumentele comenzii anterioare în corpul comenzii curente.
Acest lucru este util în reutilizarea argumentelor lungi sau complicate, pentru că evităm rescrierea lor.
Astfel nu doar că suntem mai rapizi, dar evităm și apariția unor probleme din categoria typourilor.
Să presupunem că executăm următorul șir de comenzi:
.. code-block:: bash
student@uso:~$ touch a/very/long/path/that-you-dont-want-to-retype
student@uso:~$ ls -l !$
ls -l a/very/long/path/that-you-dont-want-to-retype
Observăm că șirul ``!$`` din comanda ``ls -l !$`` a fost înlocuit cu ultimul argument al comenzii, anterioare, ``touch``.
Executați următoarele comenzi:
.. code-block:: bash
student@uso:~$ ls ~/Desktop ~/Documents ~/Downloads
student@uso:~$ ls -l !^
Ce semnificație are argumentul ``!^``?
c. Navigarea în interiorul unei comenzi
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ne găsim des în situația în care căutăm o comandă în istoric folosind funcția de reverse search, modificăm un argument al comenzii și apoi o executăm.
Pentru navigarea în cadrul textului comenzii putem folosi ``Arrow Keys``, iar pentru ștergeri putem folosi tasta ``Backspace`` sau ``Del``.
Este bine de știut, însă, că terminalul ne pune la dispoziție și o serie de scurtături cu ajutorul cărora putem face realiza aceeași acțiune mai rapid.
Dacă vreți să vă impresionați prietenii, acesta este un mod simplu, dar eficient, de a o face.
Pentru a naviga în corpul textului putem folosi combinațiile de taste:
* ``Ctrl+a`` - mută cursorul la începutul liniei
* ``Ctrl+e`` - mută cursorul la sfârșitul liniei
* ``Ctrl+f`` - mută cursorul cu un caracter înainte
* ``Ctrl+b`` - mută cursorul cu un caracter înapoi
* ``Alt+f`` - mută cursorul cu un cuvânt înainte
* ``Alt+b`` - mută cursorul cu un cuvânt înapoi
Pentru a efectua ștergeri în corpul textului putem folosi combinațiile de taste:
* ``Ctrl+k`` - șterge tot textul de la cursor până la sfârșitul liniei
* ``Ctrl+u`` - șterge tot textul de la cursor până la începutul liniei
* ``Alt+d`` - șterge tot textul de la cursor până la sfârșitul cuvântului
.. note:: Textul șters este salvat într-un registru și poate fi folosit folosind combinația de taste ``Ctrl+y``.
Funcționalitatea este similară cu procesul de **Cut** (``Ctrl+k``, ``Ctrl+u`` sau ``Alt+d``) și **Paste** (``Ctrl+y``).
* Pornirea mai multor instanțe de shell în aceelași terminal. Comanda exit și shortcut-ul ctrl+d
* Comanda `clear` și alternativa ctrl+l; bonus pt ctrl+l îl putem folosi în timp ce scriem deja o comandă
* Insistat pe importanța tastei tab și a autocompletion-ului; nu ne face doar mai rapizi, dar putem folosi tab și pt a valida că comanda este validă
* Insistat pe importanța tastei tab și a autocompletion-ului; nu ne face doar mai rapizi, dar putem folosi tab și pt a valida că comanda este validă
* History + navigat în istoricul comenzilor: arrow_keys, reverse search (ctrl+r) și ciclat prin ultimul argument al comenzilor anterioare (alt+., !!). Modificat dimensiune istoric
* Navigat în interiorul unei comenzi (ctrl+a, ctrl+e, alt+f, alt+b), modificări (ctrl+k, ctrl+u, alt+d) și paste (ctrl+y)

0 comments on commit f9e67ca

Please sign in to comment.