Warum sind Terminal und Shell in Linux zwei separate Programme?

Warum sind Terminal und Shell in Linux zwei separate Programme?

Unter Windows wird bei Verwendung der CLI nur ein Programm verwendet ( cmd.exe). Sie senden die Eingabe an cmd.exe, und cmd.exedieses sendet Ihnen wiederum die Ausgabe (zeigt die Ausgabe auf dem Bildschirm an, d. h.):

Bildbeschreibung hier eingeben

Unter Linux werden jedoch zwei Programme verwendet: das Terminal und die Shell.

Sie senden die Eingabe an das Terminal (zum Beispiel: gnome-terminal), und gnome-terminaldieses sendet diese Eingabe wiederum an die Shell (zum Beispiel: bash), und bashsendet dann die Ausgabe an gnome-terminal, und gnome-terminaldieses sendet Ihnen wiederum die Ausgabe.

Bildbeschreibung hier eingeben

Meine Frage ist: Warum sind Terminal und Shell bei Linux zwei getrennte Programme und nicht ein Programm wie bei Windows?

Antwort1

Ihre Prämisse ist falsch. Die Rolle des „Terminals“ in Windows wird mehr oder weniger von conhost.exe übernommen – das Konsolensubsystem ist nicht so konzipiert, dass es austauschbar ist, wie es bei Terminals in Linux der Fall ist (und es gibt noch andere Unterschiede, z. B. wenn Sie einen Konsolenmodusprozess wie cmd.exe starten, der noch nicht an eine Konsole angeschlossen ist, kümmern sich die Systembibliotheken, die den Prozess starten, darum, eine für Sie zu erstellen), aber es handelt sich um eine separate Ebene, die von einem separaten Prozess verwaltet wird.

Antwort2

Ich würde sagen: 1) wegen der Geschichte, 2) weil es eine gute Idee ist.

Normalerweise rufen wir gnome-terminaloder xtermein TerminalEmulator. In früheren Zeiten gab es keine Terminalemulatoren, da es keine grafischen Benutzeroberflächen gab. Alles, was es gab, war richtigeTerminals, Geräte mit Bildschirm und Tastatur, die über ein serielles Kabel verbunden sindzum Computer. Shells waren damals auch nützlich und wurden geschrieben, um die Annahme von Befehlen von Terminals zu unterstützen. (Wahrscheinlich von beliebigen Dateideskriptoren, aber das spielt keine Rolle.)

Bei Dingen wie virtuellen Linux-Terminals und GUIs war es sinnvoll, sie die Originalterminals emulieren zu lassen, damit alte Software einfach funktionierte oder zumindest mit minimalen Änderungen. Damit ist nicht nur die Shell gemeint, sondern auch andere Programme, die mit dem „Terminal“ interagieren. ( ls? vi? emacs?)

Außerdem ist die Trennung eine gute Idee, da man so den Terminalemulator und die Shell unabhängig voneinander austauschen kann. Ich kann Bash auf xterm oder zsh auf gnome-terminal oder Bash über eine SSH-Verbindung verwenden oder ...

Wenn die Teile miteinander verbunden wären, wäre diese Entscheidung schwieriger.


Übrigens bin ich mir cmd.exeauch nicht ganz sicher, was die Implementierung des Terminalemulationsteils selbst angeht. Ich habe schon seit einiger Zeit keinen Compiler mehr unter Windows angefasst, aber wenn ich mich recht erinnere, ist es möglich, eine „Konsolenanwendung“ zu erstellen, ohne einzubeziehen cmd.exe. SieheHierUndHier.

Antwort3

gnome-terminalbashwird als Standardanwendung ausgeführt , aber xtermund gnome-terminalFamilien sind dafür gedacht, beliebige Befehle auszuführen, nicht nur eine Shell. Sie können beispielsweise Folgendes ausführen:

xterm -e /bin/bash
xterm -e /usr/local/bin/fish
xterm -e tail -f /var/log/messages
xterm -e man ls

im letzten Fall zeigt mir xterm die Manpage von ls an und xtermbeendet das Programm, wenn ich es beende.

Im Fall von /var/log/messages verwende ich möglicherweise Xterm-Optionen, um die Schriftart festzulegen oder die Farbe zu ändern.

Beachten Sie, dass Sie zum Ausführen von Befehlen gnome-terminalauch -eSyntax verwenden.

Antwort4

Ich denke, das liegt daran, dass man in Linux mehrere Shells haben kann (Bash, Ksh …)

In Windows gibt es nur 1 Programm, cmd. Und jetzt braucht Microsoft 2 Programme, um mehr Funktionalität hinzuzufügen (Power Shell)

Unter Linux müssen Sie nur die Shell ändern, um Ihre Anforderungen zu verbessern

verwandte Informationen