Unter Windows wird bei Verwendung der CLI nur ein Programm verwendet ( cmd.exe
). Sie senden die Eingabe an cmd.exe
, und cmd.exe
dieses sendet Ihnen wiederum die Ausgabe (zeigt die Ausgabe auf dem Bildschirm an, d. h.):
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-terminal
dieses sendet diese Eingabe wiederum an die Shell (zum Beispiel: bash
), und bash
sendet dann die Ausgabe an gnome-terminal
, und gnome-terminal
dieses sendet Ihnen wiederum die Ausgabe.
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-terminal
oder xterm
ein 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.exe
auch 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-terminal
bash
wird als Standardanwendung ausgeführt , aber xterm
und gnome-terminal
Familien 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 xterm
beendet 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-terminal
auch -e
Syntax 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