A fost publicat un nou release al proiectului ShellCheck 0.9, care dezvoltă un sistem de analiză statică pentru scripturile shell, suportând identificarea erorilor în scripturi, având în vedere specificul bash, sh, ksh și dash. Codul proiectului este scris în Haskell și este distribuit sub licența GPLv3. Sunt disponibile componente pentru integrarea cu Vim, Emacs, VSCode, Sublime, Atom și diverse medii integrate care suportă ieșiri de erori compatibile cu GCC.

Este suportată identificarea atât a erorilor de sintaxă din cod, care conduc la generarea unor mesaje de eroare de către interpret la momentul execuției, cât și a problemelor semantice, care nu afectează execuția, dar determină anomalii în comportamentul scriptului. Analyzerul poate determina, de asemenea, problemele de performanță, problemele neclare și capcanele care pot conduce la eșecuri în anumite circumstanțe.
Printre tipurile de erori identificate se numără problemele cu escapațiile simbolurilor speciale și înfășurarea în ghilimele, erori în expresiile condiționale, utilizarea incorectă a comenzilor, problemele de procesare a timpului și datelor, precum și erorile de sintaxă tipice pentru începători. De exemplu, lipsa spațiilor la comparația '[[ $foo==0 ]]', prezența spațiilor 'var = 42' sau atribuirile cu simbolul $ 'foo=42', utilizarea variabilelor fără ghilimele 'echo $1', și specificarea bracket-urilor suplimentare 'tr -cd ‘[a-zA-Z0-9]''.
De asemenea, este suportată emiterea de recomandări pentru îmbunătățirea stilului de cod, rezolvarea problemelor de portabilitate și creșterea fiabilității scripturilor. De exemplu, în loc de 'echo $[1+2]', se va sugera utilizarea sintaxei '$(..)', construcția 'rm -rf "$STEAMROOT/"*' va fi marcată ca nesigură și capabilă să șteargă directorul root dacă variabila $STEAMROOT nu este setată, iar utilizarea 'echo {1..10}' va fi evidențiată ca fiind incompatibilă cu dash și sh.
În noua versiune:
- A fost adăugat un avertisment pentru expresiile de tip 'local readonly foo'.
- A fost adăugat un avertisment despre indisponibilitatea comenzilor.
- A fost adăugat un avertisment despre referințele circulare în 'declare x=1 y=$x'.
- A fost adăugat un avertisment dacă $? este utilizat pentru a returna codul de ieșire din echo, printf, [ ], [[ ]] și test.
- A fost adăugată o recomandare de a elimina ((..))inarray[((idx))]=val.
- A fost adăugată o recomandare de a uni parantezele duble în contexte aritmetice.
- A fost adăugată o recomandare de a elimina parantezele rotunde din expresia a[(x+1)]=val.
Sursa: opennet.ro
