Lær forskjellen mellom sourcing og forking i Bash


Hovedfokuset i denne artikkelen er å tydelig forstå hva som skjer når du kjører script vs source scriptet i bash. Først vil vi tydelig forstå hvordan programmet sendes inn når du kaller manuset på forskjellige måter.

MERK: Å lage skriptet med en utvidelse spiller ingen rolle. Skriptet vil kjøre fint selv uten utvidelser.

I utgangspunktet starter hvert skript med en linje kalt en shebang(#!). Hash-symbolet i bash vil bli tolket som kommentarer, men shebang har en spesiell betydning. Den ber bash om å sende inn programmet i hvilken som helst tolk du nevnte i shebang.

Nedenfor er et eksempelprogram og jeg spesifiserer bash som min tolk.

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

chmod +x Hello_world.sh

Nå for å kjøre skriptet, kan du gjøre det på to måter.

  • Bruk en relativ bane for å kalle skriptet. Flytt til katalogen der skriptet finnes og kjør ./Hello_world.sh.
  • Bruk den absolutte banen for å kalle skriptet. Skriv inn hele banen til skriptet fra hvor som helst i filsystemet.
./Hello_world.sh
pwd
/home/karthick/Hello_world

La oss nå se hva som skjer når du prøver å sende inn programmet uten shebang. I fravær av shebang vil programmet sendes til det nåværende skallet du kjører med. I mitt tilfelle er det Bash (/bin/bash sterk>).

La meg vise et eksempel. Jeg lager et python-skript uten shebang, og når jeg ringer programmet, vet ikke bash at det skal sende inn dette programmet til python-tolken, i stedet vil det kjøre programmet i gjeldende skall.

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

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

I dette tilfellet kan du ringe programmet ved å oppgi hvilken tolk det skal sendes til eller bare legge til shebang-linjen som alltid anbefales.

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

Nå som du vet hvordan du kaller skriptet, vil neste trinn være å forstå hva som skjer når vi kaller skriptet. Når du påkaller skriptet som vist i eksemplene ovenfor, vil det opprette en underordnet prosess (forking), og skriptet sendes til underordnet prosess. Jeg kjørte et eksempelskript som bare kjører følgende kommando og viser at skriptet sendes til en underordnet prosess.

ps -ef --forest | grep -i bash

Det kan være flere underordnede prosesser som en del av skriptet, og det avhenger av koden vår. Det skal bemerkes at miljøvariabler opprettet av subscript vil bli droppet når det er ferdig. En underordnet prosess kan få tilgang til variabler opprettet av den overordnede prosessen ved å eksportere dem. Men overordnet prosess kan ikke få tilgang til variablene som er opprettet av den underordnede prosessen.

Ta en titt på artiklene nedenfor for å forstå mer om hvordan variabler fungerer og hvordan du eksporterer variablene.

  • Forstå og skrive 'Linux-variabler' i Shell Scripting
  • Lær forskjellen mellom $$og $BASHPID i Bash

Innhenting av skriptet

"Kilde " er en innebygd skallkommando som leser filen som er sendt som et argument til den og kjører koden i det gjeldende skallmiljøet. Et passende brukstilfelle som du for det meste bruker er å endre konfigurasjonen i .bashrc eller .bash_profile og laste inn endringene på nytt ved å bruke kildekommandoen.

type -a source

Det er to syntaktiske måter å kjøre kildekommandoen på. Du kan velge hvem som helst fra to syntakser, og det er av personlig valg.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

La meg demonstrere hvordan kilden faktisk fungerer. Jeg skal lage to shell-skript. Det første skriptet (Module.sh) kommer til å inneholde noen variabler og funksjoner. Det andre skriptet (Main.sh) skal skrive ut variabelen og kalle opp funksjonen.

Fil Module.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

Angi kjøringstillatelsen for skriptet og kall hovedskriptet “main.sh ”. Nå vil dette skriptet prøve å finne funksjonen f1 og variabelen VAR1 i gjeldende skallmiljø og vil mislykkes med kommandoen ikke funnet.

bash main.sh

La oss nå kjøre kildekommandoen inne i skriptet som vil laste variabelen og funksjonene inn i det gjeldende skallmiljøet, og som vil være tilgjengelig med “main.sh ”.

Fil Module.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

Kjør nå skriptet igjen og se.

bash main.sh

Kilden er veldig nyttig i bash for å følge den modulære programmeringstilnærmingen ved å lage våre shell-skript. Vi kan dele opp koden vår i mindre moduler og kan brukes i mange programmer. På disse måtene kan vi følge DRY-prinsippet (Ikke gjenta deg selv).

Det er det for denne artikkelen. Vi har kort diskutert forskjellen mellom sourcing og forking in bash. Gå gjennom artikkelen og del din verdifulle tilbakemelding med oss.