Opt opțiuni Bash mai puțin cunoscute

Unele opțiuni Bash sunt bine cunoscute și folosite frecvent. De exemplu, mulți încep scriptul cu

set -o xtrace

pentru depanare,

set -o errexit

pentru a ieși în caz de eroare sau

set -o errunset

pentru a ieși dacă variabila apelată nu este setată.

Dar există multe alte opțiuni. Uneori, ele sunt descrise confuz în manuale, așa că am adunat aici unele dintre cele mai utile, cu explicații.

Notă: pe Mac poate fi o versiune mai veche de bash (3.x, nu 4.x), unde nu toate aceste opțiuni sunt disponibile. În acest caz, consultați aici sau aici.

set sau shopt?

Există două moduri de a seta opțiunile bash: din script sau din linia de comandă. Puteți folosi comenzi integrate set și shopt. Ambele schimbă comportamentul shell-ului, fac în mare parte același lucru (cu argumente diferite) și se deosebesc prin originea. Opțiunile set sunt moștenite sau împrumutate din opțiunile altor shell-uri, în timp ce opțiunile shopt sunt create în bash.

Dacă doriți să vedeți opțiunile curente, rulați:

$ set -o
$ shopt

Pentru a activa o opțiune în set se folosește sintaxa lungă sau scurtă:

$ set -o errunset
$ set -e

Efecul este același.

Pentru a dezactiva o opțiune, trebuie să puneți un plus în loc de minus:

$ set +e

O perioadă lungă de timp nu am putut să-mi amintesc această sintaxă, deoarece logica pare greșită (minusul activează opțiunea, iar plusul — dezactivează).

În shopt pentru activarea și dezactivarea opțiunilor se folosesc (mai logice) flag-uri -s (set) și -u (unset):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

Schimbarea directoarelor

Există câteva opțiuni care ajută la lucrul cu directoarele.

1. cdspell

Cu această setare, bash va începe să înțeleagă greșelile de tipar și te va muta în folderul al cărui nume l-ai scris greșit.

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

Am folosit această opțiune ani de zile, și foarte rar (poate o dată pe an) ia o decizie foarte ciudată. Dar în restul zilelor cdspell îmi economisește timp, practic în fiecare zi.

2. autocd

Dacă nu ești pregătit să toleri ineficiența introducerii repetate cd, atunci poți activa această opțiune pentru a te muta în folderul X, dacă comanda X nu există.

$ shopt -s autocd
$ abcdefg
$ cd ..

Împreună cu completarea automată, aceasta permite să sari rapid între foldere:

$ .\/abc[TAB][RETURN]
cd -- .\/abcdefg

Numai să nu numești folderul rm -rf * (da, de altfel, este posibil).

3. direxpand

Aceasta este o opțiune grozavă, care extinde variabilele de mediu cu apăsarea tastei Tab:

$ shopt -s direxpand
$ .\/[TAB]     # se transformă în...
$ \/full\/path\/to\/current_working_folder
$ ~\/[TAB]     # se transformă în...
$ \/full\/path\/to\/home\/folder
$ $HOME\/[TAB] #  se transformă în...
$ \/full\/path\/to\/home\/folder

Ieșire curată

4. checkjobs

Această setare oprește ieșirea din sesiune dacă în fundal încă rulează sarcini.

În loc de ieșire, se va afișa o listă a sarcinilor nefinalizate. Dacă vrei să ieși totuși, introduce din nou exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= ID-ul procesului pentru shell
$ sleep 999 &
$ exit
Există sarcini care rulează.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= ID-ul procesului pentru shell este același
$ exit
Există sarcini care rulează.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= de data aceasta ID-ul procesului s-a schimbat

Superputeri pentru substituție

5. globstar

Această opțiune îți oferă superputeri pentru substituție! Dacă introduci:

$ shopt -s globstar
$ ls **

atunci shell-ul va afișa recursiv toate directoarele și subdirectoarele.

Împreună cu direxpand poți naviga rapid prin tot ce este mai jos în ierarhie:

$ shopt -s direxpand
$ ls **[TAB][TAB]
Afișați toate cele 2033 de posibilități? (y sau n) 

6. extglob

Această opțiune activează funcții care sunt adesea asociate cu expresii regulate. Uneori, acest lucru este foarte util:

$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile

Aici, tiparele sunt plasate între paranteze și separate printr-o bară verticală. Iată operatorii disponibili:

? = соответствует нулю или одному вхождению заданных шаблонов
! = показать всё, что не соответствует заданным шаблонам
* = ноль или более вхождений
+ = одно или более вхождений
@ = ровно одно вхождение

Protecție împotriva accidentelor

7. histverify

La început poate fi puțin intimidant să folosești comenzile rapide din istoric pentru ordonarea rapidă a comenzilor !! și !$.

Opțiune histverify îți permite să vezi mai întâi cum interpretează Bash comanda, înainte ca aceasta să fie efectiv executată:

$ shopt -s histverify
$ echo !$          # <= Apăsând Enter, comanda nu se execută
$ echo histverify  # <= Aceasta este mai întâi afișată pe ecran,
histverify         # <= și apoi este executată 

8. Noclobber

Din nou, pentru protecția împotriva accidentelor, și anume împotriva scrierii peste un fișier care există deja cu operatorul de redirecționare (>). Acest lucru poate deveni catastrofal dacă nu ai o copie de rezervă.

Opțiune set -C interzice această suprascriere. Dacă este necesar, protecția poate fi ocolită cu operatorul >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster