Igen, a formázás szükséges, és óriási segítséget nyújt az összetett kód megértésében. Azok számára, akik gyakran írnak shell parancsfájlokat, a formázás kétszeres ellenőrzése unalmas feladattá válhat. Ez a cikk megmutatja, hogyan lehet a parancsikonra váltani az shfmt használatával!
Mi a shfmt?
Dustin Krysak fejlesztette ki, az shfmt egy Shell formázó, elemző és tolmács. Maga a projekt az házigazdája a GitHub és világos README és tisztán bemutatott tárháza van. Az eszközt a Go fejlesztette ki, és támogatja a POSIX, Bash és mksh héjakat. Ezzel az shfmt valóban univerzális program lesz, ahelyett, hogy csak Bash-ra korlátozódna.
Telepítés shfmt
Telepíteni shfmt a snap-kompatibilis Linux disztribúción (például az Ubuntu és a Mint) hajtsa végre a következő parancsot a terminálon:
sudo snap install shfmt
Telepíteni shfmt RedHat / Yum alapú Linux disztribúción (például az RHEL, a Centos és a Fedora) hajtsa végre a következő parancsokat a terminálján:
Megjegyzés: Az első parancs végrehajtása és a következő parancsok végrehajtása előtt újra kell indítania a gépet (vagy kijelentkezni és újra bejelentkezni).
sudo dnf install snapd sudo snap install snap-store sudo snap install shfmt
Lehetséges, hogy az RHEL-re és a Centos-ra is telepítenie kell a Először az EPEL adattár.
Az shfmt használatával
Az egyik a snap csomag telepítve van, elkezdheti az shfmt használatát.
Határozzunk meg egy nagyon rosszul formázott és írott szkriptet test.sh
alábbiak szerint:
#!/bin/bash__ echo 'not well formatted line 1' echo 'not well formatted line 2' echo 'this line has extra spaces on the end > ' func() { echo 'more unneeded spaces' echo 'way out' } func ()
Ennek a szkriptnek több kérdése van, a legfontosabb a formázása. De van egy hiba / hiba is a szkriptben: A függvényhívás func
az utolsó sort további zárójelek követik. A Bash-ban található függvényhívásnak (a funkciódefiníció helyett) csak a neve legyen, a zárójelek nem. Kicsit magasabb, hogy a megfelelő funkciódefiníció megtörtént.
Lássuk mit shfmt
erre gondol.
shfmt test.sh
Míg a kimenet kissé rejtélyesnek tűnik, vegye figyelembe, hogy a kifejezés foo
(itt használt) és bar
(itt most nem használják) gyakran használják az informatikai körökben, hogy hasonló idiómát vagy elemet jelöljenek / képviseljenek. foo
itt valóban utal func
.
Az üzenet akkor is kissé rejtélyes marad, amíg az utolsó sort nézve rájövünk, hogy ami valójában történik, az a függvénydefiníció kezdete (és nem a függvényhívás), mert a két zárójelet tartalmazta. Ez aztán megmagyarázza, hogy az üzenet miért mondja el, hogy még valami várható; nyilatkozatot kell követnie. shmft
valami ilyesmit keres itt func(){ some_command[s]; }
.
Bingó! Ez növeli a shfmt
hogy shell script érvényesítő / ellenőrző eszköz legyen, bár valószínűleg közel sem olyan átfogó, mint amiről írtunk A shellcheck használatával megkeresheti és kijavíthatja a szkriptelési hibákat. Mégis, nagyon hasznos!
Javítjuk a hibánkat, és most a beviteli szkriptet test.sh
a következőképpen szól:
#!/bin/bash__ echo 'not well formatted line 1' echo 'not well formatted line 2' echo 'this line has extra spaces on the end > ' func() { echo 'more unneeded spaces' echo 'way out' } func
Ismét kivégezzük shfmt
kóddal szemben, és sokkal megfelelőbb, jól formázott kimenetet kap:
Nagy. Ezt az egy szintet tovább tudjuk vinni, és jelezhetjük shfmt
hogy a teljes fül helyett két szóköz behúzását / fülét szeretnénk használni. Mindig két szóközt használok behúzásként / fül szélességként két szóköz használatával, és használok egy további szóközt, ahol a következő sorban lévő parancs szorosan kapcsolódik az előzőhöz, például egy folytatott parancs stb., Bár ez nem gyakran fordul elő. Több mint 10 év alatt azt tapasztaltam, hogy a két tér a személyes és a közös projekt ideális.
Mindenkinek és minden projektnek meg kell találnia a maga ideális szintaxisát, de vegye figyelembe, hogy ha egy nagy lapot (8 szóközt) használ, mint például a shfmt
a fenti példában a kódod nehezebben olvasható lesz.
A behúzás / fül szélességét két szóközre állítjuk a -i
opció (amely a --help
úgy definiálja behúzás: 0 a füleknél (alapértelmezett),> 0 a szóközök számához): shfmt -i 2 test.sh
amely a következő módon jeleníti meg a szkriptet:
#!/bin/bash__ echo 'not well formatted line 1' echo 'not well formatted line 2' echo 'this line has extra spaces on the end > ' func() { echo 'more unneeded spaces' echo 'way out' } func
Nagy! Azt azonban megjegyezzük shfmt
nem vette át a szándékos hibánkat: #!/bin/bash__
nem helyes, és el kell olvasnia #!/bin/bash
helyette.
Így továbbra is létezik felhasználási eset shellcheck hogy szkript hibákat találjon a használat mellett shfmt
hogy a szkripteket jobban formázza. Érdekes módon azonban ebben a konkrét esetben még shellcheck
nem vette észre a kérdést. Ezt a hiányosságot jelentették a shellcheck csapatnak, így a megfelelő időben ez kijavítható.
Ha többet szeretne megtudni a Linuxról, akkor tekintse át a Bash Automation & Scripting Basics sorozat, valamint a Bash Loops: for, while és amíg Bash Loops: for, while és amíg és Változók exportálása a Bash-ban: a Miért és hogyan cikkeket.
Csomagolás
A tiszta, jól formázott és hibamentes parancsfájlok írása egyszerűbbé válik, ha olyan shell-formázó eszközt használ, mint például shfmt
és egy hibajavítót shellcheck
. Még akkor is, amint láttuk, néhány dolog észrevétlen maradhat, egészen a pillanatig, amikor először futtatja a szkriptet. shfmt
egy kicsi, de hatékony segédprogram, amely segít a szkriptek és a kód formázásában a kiválasztott behúzásokkal összhangban. Élvezd!