Tanuljon meg különbséget a beszerzés és a forking között Bashban
Ennek a cikknek a fő célja, hogy világosan megértse, mi történik, amikor a szkript versus forrás parancsot a bash-ban futtatja. Először is világosan meg fogjuk érteni, hogy a program hogyan kerül benyújtásra, amikor különböző módokon hívja meg a szkriptet.
MEGJEGYZÉS: a szkript kiterjesztéssel történő létrehozása nem számít. A szkript kiterjesztés nélkül is jól fut.
Alapvetően minden szkript egy shebang(#!) sorral kezdődik. A bash-ban lévő Hash szimbólum megjegyzésként értelmezhető, de a shebang-nak különleges jelentése van. Azt mondja a bash-nek, hogy küldje be a programot a shebangban említett tolmács segítségével.
Az alábbiakban egy példaprogram látható, és a bash-t adom meg tolmácsomnak.
cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"
chmod +x Hello_world.sh
A szkript futtatásához kétféleképpen is megteheti.
- Használjon relatív elérési utat a szkript meghívásához. Lépjen abba a könyvtárba, ahol a szkript található, és futtassa a ./Hello_world.sh fájlt.
- Használja az abszolút elérési utat a szkript meghívásához. A fájlrendszer bármely pontjáról írja be a szkript teljes elérési útját.
./Hello_world.sh
pwd
/home/karthick/Hello_world
Most pedig nézzük meg, mi történik, ha shebang nélkül próbálja meg benyújtani a programját. A shebang hiányában a program bármely aktuális shellhez lesz elküldve, amivel fut, esetemben ez Bash (/bin/bash).
Hadd mutassak be egy példát. Egy python szkriptet készítek shebang nélkül, és amikor meghívom a programot, a bash nem tudja, hogy el kell küldenie ezt a programot a python interpreternek, ehelyett futtatni fogja a programot a jelenlegi burokban.
cat > run-py.py
echo $SHELL
print("Hello world")
chmod +x run-py.py
./run-py.py
Ebben az esetben meghívhatja a programot úgy, hogy megemlíti, hogy melyik tolmácsnak kell elküldenie, vagy egyszerűen hozzáadhatja a shebang sort, amely mindig ajánlott.
which python3
$(which python3) /home/karthick/run_py.py
Most, hogy tudja, hogyan kell meghívni a szkriptet, a következő lépés az lenne, hogy megértsük, mi történik, amikor meghívjuk a szkriptet. Amikor a fenti példákban bemutatott módon meghívja a szkriptet, az utódfolyamatot hoz létre (elágazás), és a szkript elküldésre kerül az alárendelt folyamatnak. Futtattam egy minta szkriptet, amely csak a következő parancsot futtatja, és megmutatja, hogy a szkriptet elküldték egy gyermekfolyamatnak.
ps -ef --forest | grep -i bash
A szkript részeként több gyermekfolyamat is lehet, és ez a kódunktól függ. Meg kell jegyezni, hogy az alsó index által létrehozott környezeti változók el lesznek vetve, ha befejeződik. Az utódfolyamatok exportálásával hozzáférhetnek a szülőfolyamat által létrehozott változókhoz. A szülőfolyamat azonban nem férhet hozzá a gyermekfolyamat által létrehozott változókhoz.
Vessen egy pillantást az alábbi cikkekre, hogy többet megtudjon a változók működéséről és a változók exportálásáról.
- A „Linux-változók” megértése és írása a Shell Scriptingben
- Tanuljon meg különbséget a $$és a $BASHPID között Bash nyelven
A forgatókönyv beszerzése
A „Source” egy shell beépített parancsa, amely beolvassa a neki argumentumként átadott fájlt, és lefuttatja a kódot az aktuális shell-környezetben. A leggyakrabban használt megfelelő használati eset a konfiguráció módosítása a .bashrc
vagy .bash_profile
fájlban, és a módosítások újratöltése a source paranccsal.
type -a source
A forrásparancs futtatásának két szintaktikai módja van. Két szintaxis közül bárkit választhat, és ez egyéni választás.
source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]
Hadd mutassam be, hogyan működik a forrás valójában. Két shell szkriptet fogok létrehozni. Az első szkript (Module.sh) tartalmaz néhány változót és függvényt. A második szkript (Main.sh) kinyomtatja a változót, és meghívja a függvényt.
Fájlja a Module.sh fájlt.
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo “Function f1 is called”
}
Fájl Main.sh.
#!/usr/bin/env bash
echo $VAR1
f1
Állítsa be a szkript végrehajtási engedélyét, és hívja meg a fő szkriptet „main.sh”. Most ez a szkript megpróbálja megtalálni az f1
függvényt és a VAR1
változót az aktuális shell-környezetben, de sikertelen lesz a not found paranccsal.
bash main.sh
Most futtassuk a forrás parancsot a szkripten belül, amely betölti a változót és a függvényeket az aktuális shell-környezetbe, és amely elérhető lesz a "main.sh" fájllal.
Fájlja a Module.sh fájlt.
#!/usr/bin/env bash
VAR1=$(echo "Welcome to $1")
function f1(){
echo "Function f1 is called"
}
Fájl Main.sh.
#!/usr/bin/env bash
source module.sh Tecmint
echo $VAR1
f1
Most futtassa újra a szkriptet, és nézze meg.
bash main.sh
A forrás nagyon hasznos a bash-ban a moduláris programozási megközelítés követéséhez shell-szkriptjeink létrehozása során. A kódunkat kisebb modulokra bonthatjuk, és számos programban használható. Ilyen módon követhetjük a SZÁRAZ (Ne ismételd meg magad) elvét.
Ennyit ehhez a cikkhez. Röviden megvitattuk a bash beszerzése és a forking közötti különbséget. Olvassa el a cikket, és ossza meg velünk értékes visszajelzéseit.