GNU/Linux >> Znalost Linux >  >> Linux

Skořápkový šok? Ne, ShellCheck! Najděte chyby ve svých skriptech.

Psát dobré scénáře je těžké. Je tu samozřejmě zřejmá dovednost PEBKAC, ale také prastará magie a historie, se staršími konvencemi, které se vztahují k Plánu 9 a FLOW-MATIC, kterým většina lidí při psaní svého softwaru ve skutečnosti nerozumí nebo je nezajímá. Neexistence dostojevského zločinu a trestu ve vývoji softwaru také znamená, že kódy mohou být líné a psát, jak chtějí.

Před hromadou měsíců jsem narazil na úhledný malý program navržený tak, aby váš shell skript méně nasával. Jmenuje se ShellCheck, je k dispozici jako online konzole a také si jej můžete nainstalovat do téměř jakéhokoli distra a poté jej začlenit do vašich pracovních postupů nebo podobně. Zaujalo mě to a vydal jsem se na průzkum.

Oheň v díře

Začal jsem s mým vlastním shell skriptem - simWANsim, programem navrženým pro simulaci latence sítě WAN jednoduchým pohodlným způsobem (nepotřebujete více rozhraní, živá média apod.). Toto je v podstatě BASH skript a chtěl jsem vidět, jak efektivní a elegantní je. BTW, skript nemusí být k vyhodnocení spustitelný.

shellcheck "název skriptu"

Překvapilo mě množství chyb a varování, ale když jsem pak začal číst, mnoho z nich bylo ve skutečnosti vícenásobnými případy stejného druhu špatného kódování, které se ve skriptu několikrát opakovaly. Navíc jsem si uvědomil, že chyby měly smysl, byly napsány srozumitelně a nebylo to jen náhodné technoblábolení. Praktické a užitečné návrhy – s příklady – jak opravit své skripty.

Jednou z běžných chyb bylo použití zpětných znamének místo zápisu $(). Měl jsem také několik dalších řádků ve stejném duchu, použití let expr, chybějící dvojité uvozovky, aby se zabránilo globování a dělení slov, a několik dalších menších problémů, jako je tento.

V simWANsim.sh řádek 152:
EGREP=`který egrep`
^-----------^ SC2006:Použijte zápis $(...) místo staršího zpětně zaškrtnutého `. ..`.
^---^ SC2230:což je nestandardní. Místo toho použijte vestavěný 'command -v'.

Měli jste na mysli:
EGREP=$(který egrep)

V simWANsim.sh řádku 304:
nech PRNT=$PRNT+1
^--------------^ SC2219:Místo 'let expr' preferujte (( expr )) .

Případová studie na mě udělala dojem [sic]. Ahoj ahoj Použil jsem možnosti, které jsem ve skutečnosti nezvládl, a také jsem neměl obecný případ pro nespecifikované příznaky. Vypadá to jako chytrý malý návrh. Nejchytřejší.

V simWANsim.sh řádek 178:
příznak $příznak v
^-- SC2213:getopts zadáno -a, ale tento 'případ' to nezpracovává.
^-- SC2213:getopts zadal -s, ale tento 'případ' to nezpracovává.
^-- SC2220:Neplatné příznaky nejsou zpracovány. Přidejte velikost písmen *).

Žádná z nich není kardinální, ale proč ne. Koneckonců, pokud dokážete vytvořit svůj kód tak čistý a elegantní, jak je to jen možné, eliminujete možnost rohových chyb a podivného chování. Nerad píšu kód, ale pokud to děláte, můžete to také dělat správně.

Také jsem testoval velmi obecný skript, abych zjistil, co se stane, když nejsou žádné chyby. Nástroj příkazového řádku se ukončí bez jakéhokoli výstupu. Pokud použijete online nástroj, dostanete vytištěnou zprávu, která zní:

$ shellcheck myscript
Nebyly zjištěny žádné problémy!

Nakonec můžete zkrášlit svůj výstup, změnit výřečnost výstupu, styl formátu a barvy, přinutit ShellCheck pracovat se specifickým dialektem shellu (včetně sh, bash, dash a ksh), zobrazit odkazy na wiki, což může být užitečné pro ty, kteří hledají pro další informace a zdroje o jejich postupech kódování a chybách, plus několik dalších možností. Celkově vzato je to jednoduché, efektivní a elegantní.

Závěr

ShellCheck je opravdu skvělý nástroj. Normálně se o věci tohoto druhu moc nestarám, ale dokážu ocenit krásu, když se nějaká najde. Samotný nástroj byl napsán v Haskell, což nás všechny staví do úplně jiné metafyzické roviny, ale nebudeme to vytýkat autorovi.

Pokud náhodou ve svém prostředí používáte skripty shellu, možná byste měli zvážit možnost vyzkoušet ShellCheck. Myslím, že budete překvapeni, protože ve vašem kódu by měly být spousty drobných, zastaralých chyb, protože lidé se zřídka vracejí a opravují staré věci a vy skončíte se zbytky, které už nedávají smysl nebo neslouží žádnému účelu. V době zbytečné nafoukanosti se počítá střídmost a elegance. Toto je chytrý způsob, jak začít se skořápkovou dietou. A tím končí další článek.


Linux
  1. Jak používat vstupy ve skriptech shellu

  2. Přidání argumentů a voleb do vašich Bash skriptů

  3. Časový limit ve skriptu Shell?

  1. Asociativní pole ve skriptech Shell?

  2. Skrýváte heslo ve skriptech Shell?

  3. Uložit výsledek hledání jako proměnnou do skriptu Shell?

  1. Povolit skripty Setuid On Shell?

  2. Správné zamykání skriptů Shell?

  3. Jak spouštět skripty Pythonu ze shellu