Weboldal keresés

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.