No Windows, ao usar a CLI, apenas um programa é usado ( cmd.exe
). Você envia a entrada para cmd.exe
e, cmd.exe
por sua vez, envia a saída (exibe a saída na tela):
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-terminal
por sua vez, envia essa entrada para o Shell (por exemplo: bash
) e, em seguida, bash
envia a saída para gnome-terminal
, e gnome-terminal
por sua vez envia a saída para você.
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-terminal
ou xterm
um 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.exe
Aliá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-terminal
será executado bash
como um aplicativo padrão, mas
xterm
, gnome-terminal
e 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, xterm
sairá.
no caso de/var/log/messages, posso usar opções do xterm para definir a fonte ou alterar a cor.
observe que gnome-terminal
também usa -e
sintaxe 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