A Bash automatizálás és a szkriptek készítésének alapjait tartalmazó három részünk utolsó cikkében a szkriptek hibakeresését, a szkriptek háttérfolyamatként történő futtatását és a többi parancsfájl importálását vizsgáljuk a forrás parancs segítségével.
Bash automatizálás és szkriptek alapjai
Ha szeretné kezdeni az elején, kérjük, olvassa el a mi oldalunkat Bash automatizálás és szkriptek alapjai 1. rész cikk. A Bash automatizálásáról és a szkriptek alapjairól szóló háromrészes sorozatunk utolsó cikke a futó szkripteket háttérfolyamatként fogja vizsgálni.
A szkriptjeinket is szeretnénk gyorsan hibakeresni, minimális felhajtás és csúcskategóriás eredmények mellett. Ez egy nagyon praktikus nyomkövetési funkcióval történhet, közvetlenül a Bash parancsértelmezőbe építve. Ezt megvizsgáljuk a második témában. Érdemes figyelnie a kapcsolódó shellcheckről szóló következő cikkünket is.
És végül meg fogjuk vizsgálni, hogyan lehet futtatni a szkripteket háttérfolyamatként. Bár ez szerény azonnali előnyökkel járhat – például több feladat egyszerre történő elindítása, ugyanakkor a későbbi fejlettebb, több szálú szkriptek számára is megalapozza a munkát.
A szkript hibakeresése
A szkript hibakeresése a Bash-ban nem feltétlenül nehéz! Figyelje a CloudSavvyIT webhelyét, amint áttekintjük a Bash átfogóbb shellcheck hibakereső eszközét, de jelenleg szeretném bemutatni Önnek a Shell szkriptek egyszerű és könnyen érthető módon történő hibakeresésének nagyszerű módját.
A Bash-héjon belül, amely végül is a „egyszerű” bináris fut a gépeden – mégpedig a bash
bináris, van egy lehetőség (-x
) ami szerint man bash
(ennek végrehajtása a terminálon megjeleníti a Bash kézikönyvet) a következőképpen van leírva Nyomtassa ki a parancsokat és argumentumaikat végrehajtásuk közben, és ez pontosan ez! Hogyan segít ez a hibakeresésben? Vessen egy pillantást a következő példára:
#!/bin/bash A=1 B=2 if [ "${AA}" == "1" -o "${B}" == "1" ]; then echo "One ('1') was definitely stored in either the variable A, or the variable B" exit 0 else echo "Assert: could not locate the value '1' in the variables A and B" exit 1 fi
Itt ellenőrizzük a változókat A
és B
az értékkel szemben 1
. A -o
szólás a if
állítás áll OR
, azaz vagy az első rész (A
, vagy inkább AA
itt van 1
) igaz, vagy a második rész (B
van 1
) igaz, és ebben az esetben siker érhető el.
A szkript kimenete a programozott állítás lesz, és a program a következő kilépési kóddal fejeződik be 1
, ami általában azt jelenti, hogy történt valami hiba. Ha a szkript helyesen működött, megerősítő üzenet jelenik meg, és a szkript a következő kilépési kóddal fejeződik be 0
, ami általában azt jelenti, hogy a parancsfájlnak vagy a segédprogramnak bármi is volt a célja.
Tehát miért fut be a szkript az állításba? Lehet, hogy már észrevette, hogy a változó A
tipusba ütközött a mi if
nyilatkozat, a kódban mint AA
: egy bogár! Mehetnénk ellenőrizni a szkriptet, és ha olyan rövid és egyértelmű, mint az itt bemutatott szkript, akkor a hibát gyorsan megtalálják. De egy 5000 soros program esetében a megoldás nem ilyen egyszerű, különösen akkor, ha több szálat, összetett alhéjat stb.
Debugáljuk ezt most a -x
opciót a Bash-re. A Bash automatizálási és szkriptelési alapok tanfolyamunk második részéből emlékezhet arra, hogy egy alhéj elindítható inline használatával $( ... )
idiómák halmaza. Egyszerű gépeléssel is kezdeményezhető bash
, vagy ebben az esetben bash -x
a felső héjunkon belül. Ebben az esetben a szkriptet a Bash alhéjon belül futtatjuk, a -x
lehetőség a lépésről lépésre történő megfigyelésre.
Így kivégeztük bash -x ./test_debugging.sh
és figyelje meg, hogy a következő feltételes ellenőrzést végezzék: '[' '' == 1 -o 2 == 1 ']'
. Észrevesszük, hogy valami nincs rendben: értéke 2
összehasonlítják a 1
feltételes ellenőrzésünk második részében, de mi történik az első részben? Valamit összehasonlítanak 1
, de az valami … üres (amit az üres karakterlánc jelez ''
)!
Ezután ellenőrizzük a szkriptünket, miért van az az üres hely, és miért nem töltötte be a mi értékünk A
változó. Gyorsan rájövünk a AA
ahelyett A
hibát, javítsa ki a hibát, és a szkript most jól működik!
Nagyon jó dolog, amire emlékezni kell a használat során bash -x
hogy tudsz tee
(ezt olvassa el ‘másolat’) a Bash parancs kimenetét azáltal, hogy a stderr-t (a hibakimenetet) átirányítja az stdout-ra (a standard kimenet), és ugyanezt rögzíti a tee
:
Itt futtatjuk a fix szkriptünket, és átirányítjuk a hibakimenetet (bash -x
az informatív hibakeresési kimenetet az stderr-nek, a standard hibakimenetnek küldi, és nem az stdout-nak) 2>&1
(amely átirányítja a stderr kimenetünket stdout-ra – a normál kimenetünkre). Ezután a stdout használatával rögzítjük tee
és ez menti a kimenetet a megadott fájlba, mégpedig bash_-x_output.txt
.
Ez lehetővé teszi a Bash fejlesztő számára, hogy lassan, lépésről lépésre átnézze az írott kódját. Különösen akkor, ha a programok bonyolulttá válnak, funkciókkal rendelkeznek, többszálúvá válnak, háttérfolyamatokat indítanak stb., A hibakeresés ezen módja nagyon értékes lehet. Példaként szoktam használni bash -x
kéthetente egyszer a komplex szkriptek hibakereséséhez.
Szkriptek futtatása háttérfolyamatként
A szkript háttérfolyamatként történő futtatása egyszerű: egyszerűen ragasszuk fel a & parancsot a szkript nevének végére (egy szóközzel). Meghatározzuk background.sh
alábbiak szerint:
#!/bin/bash sleep 2
Ezután a következő módon kezdjük el – kiemelve a háttérben futó tényt:
Amit láthatunk itt történni, az a következő: a background.sh
szkript a háttérben indul (a &
szóközzel rögzítve a parancsfájl nevéhez), és azonnal visszatér a parancssor. Ezt itt használjuk a következő parancs megadásával (sleep 1
) közvetlenül a &
háttéridióma, amely a parancsot egyetlen / egyetlen paranccsal is megszünteti (más szavakkal: sleep 1
egy teljesen új parancs).
Megszüntetjük a mi sleep 1
parancsot szokásos parancsnokság vége Bash idióma, amely után végrehajtunk egy echo
hogy a sleep 1
teljes / kész. Ezután nézzük meg, mi történik a sor végrehajtásakor.
Azonnal a háttérfolyamatunk / szkriptünk (background.sh
) elindul, és ez körülbelül 2 másodpercig fog futni. A megkezdett háttérfolyamat PID (folyamatazonosítója) vizuálisan látható (nevezetesen 773183
az első ([1]
) háttérfolyamat – és ez a PID minden más, amikor elindítasz egy háttérprogramot / folyamatot), és a mi sleep 1
(a következő végrehajtási utasítás) most végre lehet hajtani, mivel a másik program visszaadta a promptunkat (bár itt közvetlenül nem látható, ez történik, amikor elindít egy háttérfolyamatot; azonnal visszakapja a parancssort).
A sleep 1
kezdődik (a sleep 2
vagy pontosabban a background.sh
a szkript továbbra is a háttérben fut, mint más folyamat, egy alhéjban, amely a legfelső vagy magasabb szintű héj alatt kezdődött), és 1 másodperc múlva leáll. Ezek után a mi echo
kivégzik, megmutatva nekünk a sleep 1
teljes. Egy másodperccel később a mi background.sh
a folyamat 2 másodperces várakozással jár, és befejeződik.
Nem látjuk, hogy megszűnt volna, mivel a Bash héj arra vár, hogy valamilyen interakció megmutasson bennünket állapotüzenetek. Így amint megnyomjuk az Enter billentyűt, a két másodperces alvás lejárta után bármikor a háttérfolyamat befejeződését láthatjuk [1]+ Done ./background.sh
állapotüzenet. Ha visszatér a minisorozatunk második részéhez, akkor láthatja, hogyan is használhattuk volna wait
itt várni a háttérfolyamat PID befejezésére / befejezésére. Rávilágít arra is, hogy hány parancs és segédprogram használható kombinatív módon a Bash-ban.
Szkriptek importálása a következővel: forrás
Egy másik szkript importálása egyszerűen elvégezhető a Bash használatával source
parancs. Vegye figyelembe a következő szkriptet testsource.sh
:
#!/bin/bash source mysource.sh echo "${MYVAR}"
És az illesztés mysource.sh
:
#!/bin/bash MYVAR="Hello CloudSavvyIT Readers!"
Ha egyszerűen elkészítjük az első szkriptet (testsource.sh
) végrehajtható (a chmod +x testsource.sh
), de nem a második szkript (valójában a futtatható jelzőt állítottuk be, hogy egyértelműen megmutassuk, hogy ez a használatával működik chmod -x
tovább mysource.sh
), a második szkriptet továbbra is sikeresen meghívják a source
parancsot, és a testsource.sh
forgatókönyv:
Ban,-ben mysource.sh
szkriptet, beállítjuk a változót MYVAR
nak nek Hello CloudSavvyIT Readers!
. Ezt a szkriptet a testsource.sh
parancsfájl az utasítás használatával source mysource.sh
. Ez okozza a mysource.sh
ezen a ponton kell végrehajtani a kódot, és ha elkészült, a testsource.sh
A szkript továbbra is futni fog, bár a mysource.sh
megmarad (gondoljon erre úgy, mint egy másik forgatókönyvből származik hogy könnyebben emlékezzünk ennek működésére).
Összefoglalva
Megnéztük a szkript hibakeresését a használatával bash -x
az összes végrehajtott parancs megjelenítéséhez. Azt is megvizsgáltuk, hogyan futtassunk egy szkriptet háttérfolyamatként, és megtudtuk, hogyan importálhatjuk a szkripteket a forrás segítségével. Köszönöm azért, hogy figyelemmel kísérje ezt a 3 részes sorozatot, amelynek ez volt az utolsó cikke!
Ha többet szeretne megtudni a Bash-ról, mit szólna a cikkek vagy cikkek megtekintéséhez Alapozás: Bash Loops: for, while és amíg, Feltételes tesztelés Bash-ban: ha, akkor, más, elif, és Bash függvények és helyi változók