Почему Терминал и Оболочка — это две отдельные программы в Linux?

Почему Терминал и Оболочка — это две отдельные программы в Linux?

В Windows при использовании CLI используется только одна программа ( cmd.exe). Вы отправляете ввод в cmd.exe, а cmd.exeона в свою очередь отправляет вам вывод (отображает вывод на экране, то есть):

введите описание изображения здесь

Но в Linux используются две программы: Терминал и Оболочка.

Вы отправляете ввод в Терминал (например: gnome-terminal), а gnome-terminalон в свою очередь отправляет этот ввод в Оболочку (например: bash), а затем bashотправляет вывод в gnome-terminal, а gnome-terminalон в свою очередь отправляет вывод вам.

введите описание изображения здесь

У меня вопрос: почему Терминал и Оболочка — это две отдельные программы в Linux, а не одна программа, как в Windows?

решение1

Ваша предпосылка неверна. Роль «терминала» в Windows в большей или меньшей степени играет conhost.exe — консольная подсистема не спроектирована таким образом, чтобы сделать ее взаимозаменяемой, как терминалы в Linux (и есть другие различия, например, когда вы запускаете процесс консольного режима, такой как cmd.exe, еще не подключенный к консоли, системные библиотеки, которые запускают процесс, позаботятся о ее создании для вас), но это отдельный уровень, управляемый отдельным процессом.

решение2

Я бы сказал: 1) из-за истории, 2) потому что это хорошая идея.

Обычно мы звоним gnome-terminalили xtermна терминалэмулятор. В былые времена не было эмуляторов терминала, так как не было графических пользовательских интерфейсов. Все, что было, было правильнымтерминалы, устройства с экраном и клавиатурой, подключаемые через последовательный кабельк компьютеру. Оболочки тогда тоже были полезны и были написаны для поддержки приема команд с терминалов. (Возможно, из произвольных файловых дескрипторов, но это неважно.)

С чем-то вроде виртуальных терминалов Linux и GUI было полезно заставить их эмулировать оригинальные терминалы, чтобы старые части программного обеспечения просто работали или, по крайней мере, работали с минимальными изменениями. Это касается не только оболочки, но и других программ, которые взаимодействуют с "терминалом". ( ls? vi? emacs?)

Кроме того, разделение — хорошая идея, поскольку позволяет менять эмулятор терминала и оболочку независимо друг от друга. Я могу использовать Bash на xterm, или zsh на gnome-terminal, или Bash через SSH-соединение, или...

Если бы части были связаны между собой, этот выбор был бы сложнее.


Кстати, я не совсем уверен насчет cmd.exeреализации части эмуляции терминала как таковой. Я уже давно не прикасался к компилятору в Windows, но если я правильно помню, можно создать "консольное приложение" без привлечения cmd.exe. Смотритездесьиздесь.

решение3

gnome-terminalбудет работать bashкак приложение по умолчанию, но xtermи gnome-terminalсемейства предназначены для запуска произвольных команд, а не только оболочки, вы можете запустить, например:

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

в последнем случае xterm покажет мне страницу руководства ls, если я выйду, то xtermзавершит работу.

в случае /var/log/messages я могу использовать параметры xterm для установки шрифта или изменения цвета.

обратите внимание, что для запуска команд gnome-terminalтакже используется синтаксис.-e

решение4

Я думаю, потому что в Linux можно иметь несколько оболочек (bash ksh ....)

В Windows есть только 1 программа, cmd. И теперь Microsoft нужно 2 программы, чтобы добавить больше функциональности (Power Shell)

В Linux нужно только изменить оболочку, чтобы улучшить ваши требования

Связанный контент