Por que o Terminal e o Shell são dois programas separados no Linux?

Por que o Terminal e o Shell são dois programas separados no Linux?

No Windows, ao usar a CLI, apenas um programa é usado ( cmd.exe). Você envia a entrada para cmd.exee, cmd.exepor sua vez, envia a saída (exibe a saída na tela):

insira a descrição da imagem aqui

Mas no Linux existem dois programas que são usados: o Terminal e o Shell.

Você envia a entrada para o Terminal (por exemplo: gnome-terminal) e, gnome-terminalpor sua vez, envia essa entrada para o Shell (por exemplo: bash) e, em seguida, bashenvia a saída para gnome-terminal, e gnome-terminalpor sua vez envia a saída para você.

insira a descrição da imagem aqui

Minha pergunta é: por que o Terminal e o Shell são dois programas separados no Linux e não um programa como no Windows?

Responder1

Sua premissa está incorreta. O papel do "terminal" no Windows é desempenhado, mais ou menos, por conhost.exe - o subsistema do console não foi projetado de forma a torná-lo intercambiável como os terminais no Linux (e há outras diferenças, por exemplo , quando você inicia um processo no modo console, como cmd.exe, que ainda não está conectado a um console, as bibliotecas do sistema que iniciam o processo cuidarão de criar um para você), mas é uma camada separada gerenciada por um processo separado.

Responder2

Eu diria 1) por causa da história, 2) porque é uma boa ideia.

Normalmente ligamos gnome-terminalou xtermum terminalemulador. Antigamente, não existiam emuladores de terminal, pois não existiam interfaces gráficas de usuário. Tudo o que havia, era adequadoterminais, dispositivos com tela e teclado conectados via cabo serialpara o computador. Os shells também eram úteis e foram escritos para suportar comandos de terminais. (Provavelmente de descritores de arquivos arbitrários, mas isso não importa.)

Com algo como terminais virtuais e GUIs do Linux, foi útil fazê-los emular os terminais originais, para que softwares antigos simplesmente funcionassem, ou pelo menos funcionassem com alterações mínimas. Isso não significa apenas o shell, mas também outros programas que fazem interface com o "terminal". ( ls? vi? emacs?)

Além disso, a separação é uma boa ideia, pois permite trocar o emulador de terminal e o shell independentemente um do outro. Posso usar Bash no xterm, ou zsh no gnome-terminal, ou Bash em uma conexão SSH, ou...

Se as partes estivessem interligadas, essa escolha seria mais difícil.


cmd.exeAliás, também não tenho certeza sobre a implementação da parte de emulação de terminal. Faz algum tempo que não toco em um compilador no Windows, mas se bem me lembro, é possível criar um "aplicativo de console" sem envolver o cmd.exe. Veraquieaqui.

Responder3

gnome-terminalserá executado bashcomo um aplicativo padrão, mas xterm, gnome-terminale familys destinam-se a executar comandos arbitrários, não apenas shell, você pode executar, por exemplo:

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

no último caso, o xterm me mostrará a página de manual, se eu sair, xtermsairá.

no caso de/var/log/messages, posso usar opções do xterm para definir a fonte ou alterar a cor.

observe que gnome-terminaltambém usa -esintaxe para executar comandos.

Responder4

Eu acho que porque no Linux você pode ter vários shell (bash ksh ....)

No Windows só tem 1 programa, o cmd. E agora a Microsoft precisa de 2 programas para adicionar mais funcionalidades (power shell)

No Linux só é necessário alterar o shell para melhorar seus requisitos

informação relacionada