Website-Suche

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 vs. den Quellcode des Skripts in Bash ausführen. Zunächst 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 läuft auch ohne Erweiterungen einwandfrei.

Grundsätzlich beginnt jedes Skript mit einer Zeile namens shebang(#!). Das Hash-Symbol in Bash wird als Kommentar interpretiert, aber shebang hat eine besondere Bedeutung. Es weist Bash an, das Programm in dem von Ihnen in shebang genannten Interpreter einzureichen.

Unten finden Sie 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, haben Sie zwei Möglichkeiten.

  • Verwenden Sie einen relativen Pfad, um das Skript aufzurufen. Wechseln Sie in das Verzeichnis, in dem sich das Skript befindet, 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

Sehen wir uns nun an, was passiert, wenn Sie versuchen, Ihr Programm ohne shebang einzureichen. Wenn shebang nicht vorhanden ist, wird das Programm an die aktuelle Shell gesendet, mit der Sie es ausführen. In meinem Fall ist es Bash (/bin/bash ). ).

Lassen Sie mich ein Beispiel demonstrieren. Ich erstelle ein Python-Skript ohne shebang und wenn ich das Programm aufrufe, weiß bash nicht, dass es dieses Programm an den Python-Interpreter übergeben soll, stattdessen wird es das Programm ausführen in der aktuellen Shell.

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 Zeile shebang hinzufügen, was immer empfohlen wird.

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

Da 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 wie in den obigen Beispielen gezeigt aufrufen, wird ein untergeordneter Prozess erstellt (Forking) und das Skript wird an den untergeordneten Prozess übermittelt. Ich habe ein Beispielskript ausgeführt, das einfach den folgenden Befehl ausführt und zeigt, dass das Skript an einen untergeordneten Prozess übermittelt wird.

ps -ef --forest | grep -i bash

Das Skript kann mehrere untergeordnete Prozesse enthalten und hängt von unserem Code ab. Es ist zu beachten, dass von subscript erstellte Umgebungsvariablen gelöscht werden, sobald es fertig ist. Ein untergeordneter Prozess kann auf vom übergeordneten Prozess erstellte Variablen zugreifen, indem er diese exportiert. Der übergeordnete Prozess kann jedoch nicht auf die vom untergeordneten Prozess erstellten Variablen zugreifen.

Sehen Sie sich die folgenden Artikel an, um mehr über die Funktionsweise von Variablen und den Export der Variablen zu erfahren.

  • „Linux-Variablen“ in Shell-Scripting verstehen und schreiben
  • Erfahren Sie den Unterschied zwischen $$und $BASHPID in Bash

Beschaffung des Skripts

Source“ ist ein in die Shell integrierter 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 Quellbefehl.

type -a source

Es gibt zwei syntaktische Möglichkeiten, den Quellbefehl auszuführen. Sie können aus zwei Syntaxen eine beliebige auswä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) druckt die Variable und ruft die Funktion auf.

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 fehl, da der Befehl nicht gefunden wurde.

bash main.sh

Lassen Sie uns nun den Quellbefehl innerhalb des Skripts ausführen, der die Variable und Funktionen in die aktuelle Shell-Umgebung lädt und auf die über „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 nach.

bash main.sh

Die Quelle ist in Bash sehr nützlich, um bei der Erstellung unserer Shell-Skripte dem modularen Programmieransatz zu folgen. Wir können unseren Code in kleinere Module aufteilen und in vielen Programmen verwenden. 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.