Почему Терминал и Shell - это две разные программы в Linux?

Благодаря github и PyYoshi
Я нашел этот пример для systemd

Создайте файл

sudo vim /etc/systemd/system/disable-transparent-huge-pages.service

Поместите это в сервисный файл

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

Для пользователей Debian/Ubuntu

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

Затем включите службу

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages

0
15.04.2017, 00:25
5 ответов

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

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

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

-1
28.01.2020, 02:16

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

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

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

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

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


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

1
28.01.2020, 02:16

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

5
28.01.2020, 02:16

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

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

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

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

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

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

0
28.01.2020, 02:16

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 для запуска команд.

0
28.01.2020, 02:16

Теги

Похожие вопросы