Zoeken op website

Leer het verschil tussen sourcing en forking in Bash


De belangrijkste focus van dit artikel is om duidelijk te begrijpen wat er gebeurt als je het script versus de broncode van het script in bash uitvoert. Ten eerste zullen we duidelijk begrijpen hoe het programma wordt ingediend als je het script op verschillende manieren aanroept.

OPMERKING: het maken van het script met een extensie doet er niet toe. Script werkt prima, zelfs zonder extensies.

In principe begint elk script met een regel die een shebang(#!) wordt genoemd. Het Hash-symbool in bash wordt geïnterpreteerd als commentaar, maar shebang heeft een speciale betekenis. Het vertelt bash om het programma in te dienen in de tolk die je noemde in shebang.

Hieronder staat een voorbeeldprogramma en ik specificeer bash als mijn tolk.

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

chmod +x Hello_world.sh

Om het script uit te voeren, kunt u dit op twee manieren doen.

  • Gebruik een relatief pad om het script aan te roepen. Ga naar de map waar het script aanwezig is en voer ./Hello_world.sh uit.
  • Gebruik het absolute pad om het script aan te roepen. Typ overal in het bestandssysteem het volledige pad naar het script.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Laten we nu eens kijken wat er gebeurt als u uw programma probeert in te dienen zonder shebang. Bij afwezigheid van shebang zal het programma worden verzonden naar de huidige shell waarmee je draait. In mijn geval is dit Bash (/bin/bash sterk>).

Laat mij een voorbeeld demonstreren. Ik ben een Python-script aan het maken zonder shebang en als ik het programma aanroep, weet bash niet dat het dit programma aan de Python-interpreter moet voorleggen, in plaats daarvan zal het het programma uitvoeren in de huidige schil.

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

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

In dit geval kunt u het programma oproepen door te vermelden naar welke tolk het moet worden verzonden, of u kunt gewoon de regel shebang toevoegen, die altijd wordt aanbevolen.

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

Nu je weet hoe je het script moet aanroepen, is de volgende stap het begrijpen wat er gebeurt als we het script aanroepen. Wanneer u het script aanroept, zoals weergegeven in de bovenstaande voorbeelden, wordt er een onderliggend proces aangemaakt (forking) en wordt het script ingediend bij het onderliggend proces. Ik heb een voorbeeldscript uitgevoerd dat alleen de volgende opdracht uitvoert en laat zien dat het script wordt ingediend bij een onderliggend proces.

ps -ef --forest | grep -i bash

Er kunnen meerdere onderliggende processen zijn als onderdeel van het script en dat hangt af van onze code. Opgemerkt moet worden dat omgevingsvariabelen die door subscript zijn gemaakt, zullen worden verwijderd zodra het klaar is. Een onderliggend proces heeft toegang tot variabelen die door het bovenliggende proces zijn gemaakt door deze te exporteren. Maar het bovenliggende proces heeft geen toegang tot de variabelen die door het onderliggende proces zijn gemaakt.

Bekijk de onderstaande artikelen voor meer informatie over hoe variabelen werken en hoe u de variabelen kunt exporteren.

  • ‘Linux-variabelen’ begrijpen en schrijven in Shell Scripting
  • Leer het verschil tussen $$en $BASHPID in Bash

Het script verkrijgen

Bron” is een in de shell ingebouwde opdracht die het als argument doorgegeven bestand leest en de code uitvoert in de huidige shell-omgeving. Een geschikt gebruiksscenario dat u meestal gebruikt, is het wijzigen van uw configuratie in .bashrc of .bash_profile en het opnieuw laden van de wijzigingen met behulp van de source-opdracht.

type -a source

Er zijn twee syntactische manieren om de bronopdracht uit te voeren. Je kunt iemand kiezen uit twee syntaxis en het is een persoonlijke keuze.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Laat me demonstreren hoe de bron eigenlijk werkt. Ik ga twee shellscripts maken. Het eerste script (Module.sh) zal enkele variabelen en functies bevatten. Het tweede script (Main.sh) gaat de variabele afdrukken en de functie aanroepen.

Bestand Module.sh.

#!/usr/bin/env bash

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

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

Bestand Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Stel de uitvoeringsrechten voor het script in en noem het hoofdscript “main.sh ”. Nu zal dit script proberen de functie f1 en variabele VAR1 te vinden in de huidige shell-omgeving en zal mislukken met het commando not found.

bash main.sh

Laten we nu de source-opdracht in het script uitvoeren, waardoor de variabele en functies in de huidige shell-omgeving worden geladen en die toegankelijk zal zijn via “main.sh ”.

Bestand Module.sh.

#!/usr/bin/env bash

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

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

Bestand Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Voer het script nu opnieuw uit en zie.

bash main.sh

De source is erg handig in bash om de modulaire programmeeraanpak te volgen bij het maken van onze shell-scripts. We kunnen onze code in kleinere modules opdelen en in veel programma's gebruiken. Op deze manieren kunnen we het DRY-principe (Do not Repeat Yourself) volgen.

Dat is het voor dit artikel. We hebben kort het verschil besproken tussen sourcing en forking in bash. Neem het artikel door en deel uw waardevolle feedback met ons.