Der Begriff "Shell" ist gut benannt. Es ist buchstäblich eine Hülle um das Betriebssystem, die es dem Benutzer ermöglicht, mit dem Computer zu interagieren. Als es ursprünglich konzipiert wurde, gab es nur sehr wenige grafische Benutzeroberflächen (keine Fenster :(). Alles wurde über die Befehlszeile erledigt. Aber selbst die Befehlszeile brauchte einen Ort zum Leben. Sie lebte und lebt in einer Shell .
In einfachen Worten, damit die Befehlszeile nützlich war, benötigte sie Anweisungen, die sie aufrufen konnte. Daher wurden Programme in der Shell ausgeführt, damit die Befehlszeile verwendet werden kann. Die Programme waren eng in ihren eigenen Paketen zusammengefasst und sollten zusammenarbeiten. Dazu gehören Programme wie "ls" und "grep", "ps", "sed" usw. Sie enthalten auch Befehle zur Dateiumleitung wie ">" und "<" sowie Pipes ("|"). Noch wichtiger ist, dass sie auch Programmierkonstrukte wie bedingte Operationen enthalten (wenn dann für Schleifen, während Schleifen, Möglichkeiten, den Status zu überprüfen, der beim Ausführen einer Anweisung zurückgegeben wird (z. B. wenn Sie "ls" ausführen, hat es etwas gefunden?)) so wie das). Dies sind die Grundlagen komplexerer Befehlszeilenskripte (Shell).
Wenn jemand den Begriff "Bash Shell" verwendet, spricht er von einem Befehlszeileninterpreter namens "Bash", der in der O / S-Shell ausgeführt wird. Man könnte es sich als Abkürzung für 'Bash Shell Interpreter' vorstellen. Es gibt andere Dolmetscher wie Bourne (Bash ist eine neue und verbesserte Bourne Shell und steht für Bourne Again Shell). Es gibt auch die C-Shell, die K-Shell (von vielen bevorzugt, die komplexe Shell-Skripte schreiben) und andere GNU-Varianten. Im Laufe der Jahre ist es üblich geworden, auf den bestimmten Befehlszeileninterpreter zu verweisen, den Sie als Shell verwenden, da einer ohne den anderen nicht verwendet werden kann. Aber die Realität ist, dass sie unterschiedlich sind.
Warum sie eigentlich als Befehlszeileninterpreter und nicht als eigentliche Shell bekannt sind: Dies liegt daran, dass sie in der Shell leben und alle Befehle so interpretieren, als würden sie in einem Programm ausgeführt. Und der Shell ist es egal, welchen Interpreter Sie darin ausführen, solange sie den richtigen Standards entspricht.
Und warum sie Dolmetscher genannt werden, liegt daran, dass sie wirklich Dolmetscher sind. Auch wenn Sie ein Skript nicht explizit ausführen (und ein Skript ist eigentlich nur eine Textdatei mit Befehlen, die Sie erstellen, damit Sie dieselben Befehle immer wieder ausführen können, ohne sie erneut eingeben zu müssen). Nehmen Sie zum Beispiel den bescheidenen Befehl 'ls'. Wenn Sie es ausführen, wird eine Liste der Dateien zurückgegeben. Für Ihre Frage ist es jedoch wichtiger, wie es ausgeführt wird: Es wird tatsächlich im Kontext des Befehlszeileninterpreters ausgeführt, selbst wenn Sie nur einen scheinbar einfachen einmaligen Befehl ausführen. Das heißt, es läuft so, als wäre es eine Aussage in einem größeren Programm. Es läuft wie in einer Shell-Skript-Skriptdatei, ohne sich tatsächlich in einer Shell-Skriptdatei zu befinden. Eine anonyme Shell-Skriptdatei.
Alles, was Sie in der Befehlszeile ausführen, hat dies gemeinsam (sei es ein einzelner Befehl wie 'ls' oder eine Skriptdatei voller Befehle und Iteratoren und bedingter Anweisungen): Alles wird vom Befehlszeileninterpreter verarbeitet. sei es Bash, C-Shell, K-Shell (Standard unter AIX übrigens).
Um zu sehen, was ich meine, machen Sie ein Verzeichnis 'test':
mkdir test
Geben Sie es ein und führen Sie die folgenden Befehle aus
grep hello *
Sie erhalten eine Antwort wie "Keine solche Datei oder kein solches Verzeichnis". Geben Sie nun den Befehl ein
echo $?
($? sagt, sag mir, was du in einem kryptischen Computer gefunden hast.) Du solltest sehen, dass es eine Zahl (es sollte sein) '2' zurückgibt. Dies ist der Rückkehrcode von grep, der "keine solche Datei oder kein solches Verzeichnis" bedeutet. Führen Sie nun Folgendes aus:
echo hello > hello.txt
grep hello *
echo $?
Sie sehen die Datei 'hello.txt', die vom ersten grep-Befehl zurückgegeben wurde, und sollten jetzt das 'echo $?' Geben Sie die Zahl '0' zurück, was bedeutet, dass tatsächlich etwas gefunden wurde.
Selbst wenn diese scheinbar einmaligen Befehle ausgeführt werden, verhält sich der Befehlszeileninterpreter so, als wären sie Teil eines größeren Programms und verfolgt ihre Rückgabewerte. Wenn Sie das * am Ende des Befehls grep vergessen, wird es daher nicht zurückgegeben. Es ist bekannt, dass die Aussage unvollständig ist und mehr Input erwartet. Schließlich könnten Sie ihn möglicherweise bitten, die Ergebnisse einer Schleife zu erfassen, deren Schreiben und Ausführen in der Befehlszeile völlig legal ist.
Unterm Strich ist die Shell die Shell, und der Interpreter (unabhängig vom Namen des von Ihnen verwendeten, 'Bash', K-Shell usw.) ist unterschiedlich. Aber oft werden sie austauschbar verwendet, weil sie zu jedem Zeitpunkt vollständig miteinander verbunden sind.