Почему Terminal и Shell являются двумя отдельными программами в Linux?

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

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

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

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

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

Мой вопрос: почему терминал и оболочка являются двумя отдельными программами в Linux, а не одной программой, например, в Windows?

5 Solutions collect form web for “Почему Terminal и Shell являются двумя отдельными программами в Linux?”

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

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

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

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

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

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


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

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

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

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

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

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

Мир Windows сильно отличается от мира Unix. Одно из отличий заключается в том, что в Windows исполняемый файл имеет специальные данные внутри него, которые сообщают операционной системе, какой он исполняемый; для целей этого вопроса существуют древовидные типы исполняемых файлов:

  • Исполняемые файлы, которые выполняются в традиционной графической подсистеме. Они обещают создать свои собственные окна, если это необходимо, а также читать и отвечать на сообщения, генерируемые графической подсистемой.

  • Исполняемые файлы, которые запускаются в консольной подсистеме. Они требуют, чтобы операционная система создавала для них особый вид окна ( консоль ). Консоль берет на себя обязанности по перекодированию сообщений и дает программе более простую среду.

  • Исполняемые файлы, которые запускаются в подсистеме Windows 8 «Современный интерфейс». Это похожие программы, которые выполняются в графической подсистеме, но используют другой API (и рассматриваются как отдельный класс процессов ОС).

cmd.exe – не единственная программа, которая запускается в консоли. Есть множество консольных программ, включая порты очень большого количества утилит GNU (см., Например, проект GnuWin32 ) и PowerShell , альтернативную консольную оболочку для Windows 7 и более новую, очень гибкую и мощную, чем cmd.exe .

Когда консольная программа запускается в консоли, вы не взаимодействуете непосредственно с программой, вы взаимодействуете с консольной подсистемой, которая посредничает между вводом пользователя и запущенной программой; например, консольная подсистема переводит нажатия клавиш в кодированные символы, ожидаемые консольной программой, и использует указанный файл шрифта для перевода символов, выводимых программой, в красивые картинки, которые видит пользователь.

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

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

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

  • Как найти количество вертикальных линий, доступных в терминале?
  • пространство консоли, съеденное содержимым файла
  • appending & to unrecognized command закрывает вкладку терминала
  • Для чего нужен файл .screenrc?
  • Сбросить фон до прозрачного с помощью tmux?
  • Как связать (двойное) нажатие клавиши Shift в tmux?
  • Как создать окно терминала с одной вкладкой на длинный сценарий, который я могу убить индивидуально с помощью ctrl-C и перезапустить?
  • Отправка сообщения от одного пользователя терминала другому пользователю
  • Почему блок-разделитель (ASCII 31) невидим в выводах терминала?
  • уничтожение всех процессов, связанных со сценарием
  • отключить CTRL-D окно закрыть в терминаторе (эмулятор терминала)
  • Interesting Posts

    Настройка user1 только для пользователя2 (с аутентификацией пароля)

    Как я могу отлаживать трафик в коммутируемой сети с помощью Wireshark?

    airmon-ng: ls: невозможно получить доступ к / sys / class / ieee80211 /: Нет такого файла или каталога

    как запустить команду диалога с запросом

    Как определить, имеет ли процессор 64 или 32 бит?

    «Sudo service uwsgi restart» возвращает , однако журналы uwsgi показывают, что процессы были созданы и запущено приложение python

    Имеет ли segfaults плохую память

    Количество файлов в каталоге

    Как включить два сетевых интерфейса как для Интернета в ubuntu12.04

    цвета терминала гнома

    Как проверить, перезагрузится ли мой компьютер (или завершение работы)?

    FreeBSD: смешивание пакетов и портов?

    Что делает следующий скрипт?

    VIM отображает совпадения регулярных выражений при вводе

    Когда вилки процесса являются копией его виртуальной или резидентной памяти?

    Linux и Unix - лучшая ОС в мире.