Naučite razliku između izvora i forkinga u Bashu


Glavni fokus ovog članka je jasno razumjeti šta se dešava kada pokrenete script vs source skriptu u bash-u. Prvo, jasno ćemo razumjeti kako se program šalje kada pozivate skriptu na različite načine.

NAPOMENA: kreiranje skripte s ekstenzijom nije važno. Skripta će raditi dobro čak i bez ekstenzija.

U osnovi, svaka skripta počinje linijom koja se zove shebang(#!). Simbol Hash u bash-u će se tumačiti kao komentari, ali shebang ima posebno značenje. Kaže bash-u da preda program u bilo kojem tumaču koji ste spomenuli u shebangu.

Ispod je primjer programa i ja navodim bash kao moj interpreter.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

Sada da pokrenete skriptu, možete to učiniti na dva načina.

  • Koristite relativnu putanju za pozivanje skripte. Premjestite se u direktorij u kojem se nalazi skripta i pokrenite ./Hello_world.sh.
  • Koristite apsolutnu putanju za pozivanje skripte. S bilo kojeg mjesta u sistemu datoteka otkucajte punu putanju do skripte.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Sada da vidimo šta se dešava kada pokušate da pošaljete svoj program bez shebanga. U nedostatku shebanga, program će biti dostavljen bilo kojoj trenutnoj ljusci s kojom koristite, u mom slučaju, to je Bash (/bin/bash).

Dozvolite mi da pokažem primjer. Kreiram python skriptu bez shebang i kada pozovem program, bash ne zna da bi trebao poslati ovaj program python interpreteru, umjesto toga će pokrenuti program u trenutnoj ljusci.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

U ovom slučaju, možete pozvati program tako što ćete navesti kojem tumaču ga treba poslati ili jednostavno dodati liniju shebang koja se uvijek preporučuje.

which python3
$(which python3) /home/karthick/run_py.py

Sada kada znate kako da pozovete skriptu, sledeći korak bi bio da razumete šta se dešava kada pozovemo skriptu. Kada pozovete skriptu kao što je prikazano u gornjim primjerima, ona će kreirati podređeni proces (forking) i skripta će biti dostavljena podređenom procesu. Pokrenuo sam uzorak skripte koja će samo pokrenuti sljedeću naredbu i pokazuje da je skripta poslana podređenom procesu.

ps -ef --forest | grep -i bash

Može postojati više podređenih procesa kao dio skripte i to ovisi o našem kodu. Treba napomenuti da će varijable okruženja koje kreira subscript biti ispuštene kada se završi. Podređeni proces može pristupiti varijablama kreiranim od strane nadređenog procesa izvozom. Ali roditeljski proces ne može pristupiti varijablama koje je kreirao podređeni proces.

Pogledajte članke u nastavku da biste razumjeli više o tome kako varijable rade i kako ih izvesti.

  • Razumijevanje i pisanje 'Linux varijabli' u shell skriptiranju
  • Naučite razliku između $$i $BASHPID-a u Bashu

Izvor skripte

Izvor” je naredba ugrađena u ljusku koja čita datoteku koja joj je proslijeđena kao argument i pokreće kod u trenutnom okruženju ljuske. Odgovarajući slučaj upotrebe koji najčešće koristite je izmjena vaše konfiguracije u .bashrc ili .bash_profile i ponovno učitavanje promjena pomoću naredbe izvora.

type -a source

Postoje dva sintaktička načina za pokretanje naredbe izvora. Možete izabrati bilo koga od dvije sintakse i to je po ličnom izboru.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Dozvolite mi da pokažem kako izvor zapravo funkcionira. Napravit ću dvije shell skripte. Prva skripta (Module.sh) će sadržati neke varijable i funkcije. Druga skripta (Main.sh) će ispisati varijablu i pozvati funkciju.

Fajl Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Fajl Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Postavite dozvolu za izvršavanje za skriptu i pozovite glavnu skriptu “main.sh ”. Sada će ova skripta pokušati pronaći funkciju f1 i varijablu VAR1 u trenutnom okruženju ljuske i neće uspjeti s naredbom koja nije pronađena.

bash main.sh

Sada pokrenimo izvornu naredbu unutar skripte koja će učitati varijablu i funkcije u trenutno okruženje ljuske i koja će biti dostupna putem “main.sh”.

Fajl Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Fajl Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Sada ponovo pokrenite skriptu i pogledajte.

bash main.sh

Izvor je vrlo koristan u bashu za praćenje modularnog programskog pristupa u kreiranju naših shell skripti. Naš kod možemo razbiti na manje module i možemo ga koristiti u mnogim programima. Na ove načine možemo slijediti princip DRY (Ne ponavljaj se).

To je to za ovaj članak. Ukratko smo razgovarali o razlici između izvora i forkinga u bash-u. Prođite kroz članak i podijelite s nama svoje vrijedne povratne informacije.