Léiert den Ënnerscheed tëscht Sourcing a Forking zu Bash


Den Haaptfokus vun dësem Artikel ass kloer ze verstoen wat geschitt wann Dir de Skript vs d'Quell vum Skript am Bash leeft. Als éischt wäerte mir kloer verstoen wéi de Programm presentéiert gëtt wann Dir de Skript op verschidde Weeër nennt.

NOTÉIERT: Schreift de Skript mat enger Extensioun ass egal. Skript wäert gutt lafen och ouni Extensiounen.

Prinzipiell fänkt all Skript mat enger Zeil un, genannt Shebang (#!). Den Hash Symbol am Bash gëtt als Kommentarer interpretéiert, awer Shebang huet eng speziell Bedeitung. Et seet de Bash de Programm ofzeginn an egal wéi en Dolmetscher deen Dir am Shebang ernimmt hutt.

Drënner sinn e Beispillprogramm an ech spezifizéieren Bash als meng Dolmetscher.

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

$ chmod +x Hello_world.sh

Elo fir de Skript auszeféieren, kënnt Dir et op zwou Weeër maachen.

  • Benotzt e relativen Wee fir de Skript ze ruffen. Gitt an de Verzeechnes wou de Skript präsent ass a lafen ./Hello_world.sh.
  • Benotzt den absolute Wee fir de Skript ze ruffen. Vun iwwerall am Dateiesystem gitt de ganze Wee op d'Skript.

$ ./Hello_world.sh
$ pwd
$ /home/karthick/Hello_world

Loosst eis elo kucken wat geschitt wann Dir probéiert Äre Programm ouni Shebang ofzeginn. Beim Fehlen vu Shebang gëtt de Programm op déi aktuell Shell presentéiert, mat där Dir leeft, a mengem Fall ass et Bash (/bin/bash).

Loosst mech e Beispill weisen. Ech erstellen e Python Skript ouni Shebang a wann ech de Programm ruffen, weess de Bash net datt et dëse Programm un de Python Dolmetscher sollt ofginn anstatt datt et de Programm an der aktueller Shell leeft.

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

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

An dësem Fall kënnt Dir de Programm uruffen andeems Dir nennt op wéi en Dolmetscher et soll ofgeleet ginn oder einfach d'Shebang-Linn derbäisetzen, déi ëmmer recommandéiert ass.

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

Elo datt Dir wësst wéi Dir de Skript nennt, ass de nächste Schrëtt ze verstoen wat geschitt wa mir de Skript nennen. Wann Dir de Skript oprufft wéi an den uewe genannte Beispiller gewise gëtt, erstellt et e Kannerprozess (Gabel) an de Skript gëtt an de Kannerprozess presentéiert. Ech hunn e Probe Skript gelaf, deen just de folgende Kommando ausféiert a weist datt de Skript un e Kandprozess presentéiert gëtt.

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

Et kënne verschidde Kannerprozesser als Deel vum Skript sinn an dat hänkt vun eisem Code of. Et ass ze bemierken datt d'Ëmweltvariablen, déi duerch Abonnement erstallt sinn, erofgelooss ginn wann et fäerdeg ass. E Kandprozess kann Zougang zu Variablen erstallt vum Elterendeelprozess andeems se se exportéieren. Awer den Elterenprozess kann net op d'Variabelen erstallt ginn, déi vum Kandprozess erstallt ginn.

Kuckt d'Artikelen hei ënnen fir méi ze verstoen wéi Variablen funktionnéieren a wéi d'Variabelen exportéiert ginn.

  • Verstoen a schreiwen 'Linux Variablen' am Shell Scripting
  • Léiert den Ënnerscheed tëscht $$an $BASHPID am Bash

D'Surcing vum Skript

\Source ass e Shell agebaute Kommando, deen d'Datei liest, déi als Argument derbäi ass, an de Code am aktuellen Shell-Ëmfeld leeft. E passende Benotzungsfall, deen Dir meeschtens benotzt, ass Änneren vun Ärer Konfiguratioun an .bashrc oder .bash_profile a lued d'Ännerunge mat dem Quellbefehl nei.

$ type -a source

Et ginn zwou syntaktesch Weeër fir de Quellbefehl auszeféieren. Dir kënnt jiddereen aus zwou Syntaxen wielen an et ass vu perséinleche Choix.

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

Loosst mech weisen wéi d'Quell tatsächlech funktionnéiert. Ech wäert zwee Shell Scripten erstellen. Den éischte Skript (Module.sh) wäert e puer Variabelen a Funktiounen halen. Dat zweet Skript (Main.sh) wäert d'Variabel drécken an d'Funktioun ruffen.

Datei Module.sh.

#!/usr/bin/env bash

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

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

Datei Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Setzt d'Ausféierungserlaabnes fir de Skript a rufft den Haaptskript \main.sh. Elo probéiert dëse Skript d'Funktioun f1 an d'Variabel VAR1 am aktuellen ze fannen. Shell Ëmfeld a wäert versoen mam Kommando net fonnt.

$ bash main.sh

Loosst eis elo de Quellbefehl am Skript ausféieren, deen d'Variabel an d'Funktiounen an d'aktuell Shell-Ëmfeld luet an dat zougänglech ass vun main.sh.

Datei Module.sh.

#!/usr/bin/env bash

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

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

Datei Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Elo lafen de Skript erëm a kuckt.

$ bash main.sh

D'Quell ass ganz nëtzlech am Bash fir d'modulare Programméierungs Approche ze verfollegen bei der Schafung vun eise Shell Scripten. Mir kënnen eise Code a méi kleng Moduler opbriechen a kënne a ville Programmer benotzt ginn. Op dës Manéier kënne mir de DRY (Don't Repeat Yourself) Prinzip verfollegen.

Dat ass et fir dësen Artikel. Mir hunn den Ënnerscheed tëscht Sourcing a Forking am Bash kuerz diskutéiert. Gitt duerch den Artikel an deelt Äre wäertvolle Feedback mat eis.