Lær forskellen mellem sourcing og forking i Bash


Hovedfokus for denne artikel er klart at forstå, hvad der sker, når du kører scriptet vs kilde scriptet i bash. Først vil vi tydeligt forstå, hvordan programmet sendes, når du kalder scriptet på forskellige måder.

BEMÆRK: Oprettelse af scriptet med en udvidelse betyder ikke noget. Script kører fint, selv uden udvidelser.

Dybest set starter hvert script med en linje kaldet en shebang (#!). Hash-symbolet i bash fortolkes som kommentarer, men shebang har en særlig betydning. Det fortæller bash at indsende programmet i den tolk, du nævnte i shebang.

Nedenfor er et eksempelprogram, og jeg angiver bash som min tolk.

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

$ chmod +x Hello_world.sh

Nu for at køre scriptet kan du gøre det på to måder.

  • Use a relative path to call the script. Move to the directory where the script is present and run ./Hello_world.sh.
  • Use the absolute path to call the script. From anywhere in the file system type the full path to the script.
$ ./Hello_world.sh
$ pwd
$ /home/karthick/Hello_world

Lad os nu se, hvad der sker, når du prøver at indsende dit program uden shebang. I mangel af shebang sendes programmet til den aktuelle shell, du kører med. I mit tilfælde er det Bash (/ bin/bash).

Lad mig demonstrere et eksempel. Jeg opretter et python-script uden shebang, og når jeg ringer til programmet, ved bash ikke, at det skal sende dette program til pythontolken i stedet for at køre programmet i den aktuelle skal.

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

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

I dette tilfælde kan du ringe til programmet ved at nævne, hvilken tolk det skal sendes til eller bare tilføje shebang-linjen, som altid anbefales.

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

Nu hvor du ved, hvordan man kalder scriptet, er det næste trin at forstå, hvad der sker, når vi kalder scriptet. Når du påberåber scriptet som vist i eksemplerne ovenfor, oprettes det en underordnet proces (forking), og scriptet sendes til underprocessen. Jeg kørte et eksempelscript, der bare kører følgende kommando og viser, at scriptet sendes til en underordnet proces.

$ ps -ef --forest | grep -i bash

Der kan være flere underordnede processer som en del af scriptet, og det afhænger af vores kode. Det skal bemærkes, at miljøvariabler, der oprettes ved abonnement, slettes, når det er færdigt. En underordnet proces kan få adgang til variabler oprettet af den overordnede proces ved at eksportere dem. Men overordnet proces kan ikke få adgang til de variabler, der er oprettet af underordnet proces.

Se nedenstående artikler for at forstå mere om, hvordan variabler fungerer, og hvordan man eksporterer variablerne.

  • Understanding and Writing ‘Linux Variables’ in Shell Scripting
  • Learn Difference Between $$ and $BASHPID in Bash

Sourcing af scriptet

"Kilde" er en shell-indbygget kommando, der læser den fil, der er sendt som et argument til den, og kører koden i det aktuelle shell-miljø. En passende brugssag, som du mest bruger, er at ændre din konfiguration i .bashrc eller .bash_profile og genindlæse ændringerne ved hjælp af kilde-kommandoen.

$ type -a source

Der er to syntaktiske måder at køre kildekommandoen på. Du kan vælge enhver fra to syntakser, og det er efter eget valg.

$ source FILE_NAME [ARGUMENTS]
$ . FILE_NAME [ARGUMENTS]

Lad mig demonstrere, hvordan kilden faktisk fungerer. Jeg skal oprette to shell-scripts. Det første script (Module.sh) indeholder nogle variabler og funktioner. Det andet script (Main.sh) udskriver variablen og kalder funktionen.

Filmodul.sh.

#!/usr/bin/env bash

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

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

Fil Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Indstil eksekveringstilladelsen for scriptet, og kald hovedskriptet "main.sh". Nu vil dette script forsøge at finde funktionen f1 og variabel VAR1 i det aktuelle shell-miljø og fejler med kommandoen ikke fundet.

$ bash main.sh

Lad os nu køre kommandoen kilde inde i scriptet, som vil indlæse variablen og funktionerne i det aktuelle shell-miljø, og som vil være tilgængelig med "main.sh".

Filmodul.sh.

#!/usr/bin/env bash

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

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

Fil Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Kør nu scriptet igen og se.

$ bash main.sh

Kilden er meget nyttig i bash for at følge den modulære programmeringsmetode til oprettelse af vores shell-scripts. Vi kan bryde vores kode i mindre moduler og kan bruges i mange programmer. På disse måder kan vi følge DRY (Don't Repeat Yourself) -princippet.

Det er det for denne artikel. Vi har kort diskuteret forskellen mellem sourcing og forking i bash. Gå gennem artiklen, og del din værdifulde feedback med os.