В 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 нужно только изменить оболочку, чтобы улучшить ваши требования