Erfahren Sie den Unterschied zwischen Sourcing und Forking in Bash
Das Hauptaugenmerk dieses Artikels liegt darauf, klar zu verstehen, was passiert, wenn Sie das Skript ausführen und das Skript in bash quellen. Zuerst werden wir klar verstehen, wie das Programm übermittelt wird, wenn Sie das Skript auf unterschiedliche Weise aufrufen.
HINWEIS: Das Erstellen des Skripts mit einer Erweiterung spielt keine Rolle. Das Skript wird auch ohne Erweiterungen einwandfrei ausgeführt.
Grundsätzlich beginnt jedes Skript mit einer Zeile, die als shebang(#!) bezeichnet wird. Das Hash-Symbol in der Bash wird als Kommentar interpretiert, aber Shebang hat eine besondere Bedeutung. Es weist Bash an, das Programm in dem Interpreter einzureichen, den Sie in Shebang erwähnt haben.
Unten ist ein Beispielprogramm und ich gebe bash als meinen Interpreter an.
$ cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"
chmod +x Hello_world.sh
Um das Skript nun auszuführen, können Sie dies auf zwei Arten tun.
- Verwenden Sie einen relativen Pfad, um das Skript aufzurufen. Wechseln Sie in das Verzeichnis, in dem das Skript vorhanden ist, und führen Sie ./Hello_world.sh aus.
- Verwenden Sie den absoluten Pfad, um das Skript aufzurufen. Geben Sie an einer beliebigen Stelle im Dateisystem den vollständigen Pfad zum Skript ein.
$ ./Hello_world.sh
pwd
/home/karthick/Hello_world
Schauen wir uns nun an, was passiert, wenn Sie versuchen, Ihr Programm ohne Shebang einzureichen. In Ermangelung von Shebang wird das Programm an die aktuelle Shell gesendet, mit der Sie ausgeführt werden. In meinem Fall ist es Bash (/bin/bash).
Lassen Sie mich ein Beispiel anführen. Ich erstelle ein Python-Skript ohne Shebang und wenn ich das Programm aufrufe, weiß Bash nicht, dass es dieses Programm an den Python-Interpreter senden soll, stattdessen wird das Programm in der aktuellen Shell ausgeführt.
$ cat > run-py.py
echo $SHELL
print("Hello world")
chmod +x run-py.py
./run-py.py
In diesem Fall können Sie das Programm aufrufen, indem Sie angeben, an welchen Interpreter es gesendet werden soll, oder einfach die Shebang-Zeile hinzufügen, die immer empfohlen wird.
# which python3
$(which python3) /home/karthick/run_py.py
Nachdem Sie nun wissen, wie das Skript aufgerufen wird, besteht der nächste Schritt darin, zu verstehen, was passiert, wenn wir das Skript aufrufen. Wenn Sie das Skript aufrufen, wie in den obigen Beispielen gezeigt, wird ein untergeordneter Prozess erstellt (Forking), und das Skript wird an den untergeordneten Prozess übermittelt. Ich habe ein Beispielskript ausgeführt, das nur den folgenden Befehl ausführt und zeigt, dass das Skript an einen untergeordneten Prozess übermittelt wird.
$ ps -ef --forest | grep -i bash
Es kann mehrere untergeordnete Prozesse als Teil des Skripts geben, und das hängt von unserem Code ab. Es ist zu beachten, dass Umgebungsvariablen, die von subscript erstellt wurden, gelöscht werden, sobald es fertig ist. Ein untergeordneter Prozess kann auf Variablen zugreifen, die vom übergeordneten Prozess erstellt wurden, indem er sie exportiert. Der übergeordnete Prozess kann jedoch nicht auf die Variablen zugreifen, die vom untergeordneten Prozess erstellt wurden.
Werfen Sie einen Blick auf die folgenden Artikel, um mehr darüber zu erfahren, wie Variablen funktionieren und wie Sie die Variablen exportieren.
- Verstehen und Schreiben von 'Linux-Variablen' in Shell-Scripting
- Erfahren Sie den Unterschied zwischen $$und $BASHPID in Bash
Beschaffung des Skripts
"Source" ist ein in die Shell eingebauter Befehl, der die als Argument übergebene Datei liest und den Code in der aktuellen Shell-Umgebung ausführt. Ein geeigneter Anwendungsfall, den Sie am häufigsten verwenden, ist das Ändern Ihrer Konfiguration in .bashrc oder .bash_profile und das erneute Laden der Änderungen mit dem Befehl source.
$ type -a source
Es gibt zwei syntaktische Möglichkeiten, den Quellbefehl auszuführen. Sie können aus zwei Syntaxen wählen und es ist eine persönliche Entscheidung.
$ source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]
Lassen Sie mich zeigen, wie die Quelle tatsächlich funktioniert. Ich werde zwei Shell-Skripte erstellen. Das erste Skript (Module.sh) wird einige Variablen und Funktionen enthalten. Das zweite Skript (Main.sh) wird die Variable ausgeben und die Funktion aufrufen.
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
Legen Sie die Ausführungsberechtigung für das Skript fest und rufen Sie das Hauptskript "main.sh" auf. Dieses Skript versucht nun, die Funktion f1 und die Variable VAR1 in der aktuellen Shell-Umgebung zu finden, und schlägt mit dem Befehl not found fehl.
$ bash main.sh
Lassen Sie uns nun den Quellbefehl innerhalb des Skripts ausführen, der die Variable und die Funktionen in die aktuelle Shell-Umgebung lädt und auf die mit "main.sh" zugegriffen werden kann.
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
Führen Sie nun das Skript erneut aus, und sehen Sie.
$ bash main.sh
Der Quellcode ist in bash sehr nützlich, um dem modularen Programmieransatz bei der Erstellung unserer Shell-Skripte zu folgen. Wir können unseren Code in kleinere Module aufteilen und in vielen Programmen verwendet werden. Auf diese Weise können wir dem DRY-Prinzip (Don't Repeat Yourself) folgen.
Das war's für diesen Artikel. Wir haben kurz den Unterschied zwischen Sourcing und Forking in bash besprochen. Lesen Sie den Artikel durch und teilen Sie uns Ihr wertvolles Feedback mit.








