Dúvida entre os termos: Terminal, Console e Shell.
Qual a diferença entre eles?
Sou alguém um pouco chato, e se eu não consigo uma definição que eu ache certa, ela não me agrada e não paro de procurar até encontrar. Recentemente em meus estudos estava vendo sobre alguns termos e me deparei com estes no título do post.
Durante toda a jornada de desenvolvedor (ou em T.I em geral) você se deparará com pessoas e profissionais se referindo aos termos como similares, algumas vezes até sendo a mesma coisa. Sei que alguns citam tais termos em certos contextos para menor complexidade da explicação, mas não é isso que quero tratar aqui.
Para deixar claro, eu sei o que é um Terminal Linux, Windows e afins, o que quero saber é especificamente relacionado aos termos. Durante minhas pesquisas, cheguei a algumas conclusões, e queria que profissionais experientes me dissessem o que está certo e o que está errado.
- Terminal é um termo genérico e abstrato que refere-se a qualquer maneira ou interface usada para trocar informações com um sistema computacional.
- Um Console é um conjunto de dispositivos que fornecem uma maneira de inserir e retirar dados de um sistema computacional. Eles podem ser considerados físicos, como um setup de computador (que possui mouses, teclados, monitores, impressoras, microfones, autofalantes etc), ou virtuais, como o Prompt de Comando do Windows, as famosas "telas pretas" (embora, para o usuário comum, tecnicamente elas não funcionariam sem o conjunto de console físico). Todo Console pode ser considerado um Terminal, pois ele concretiza a troca de informações entre o sistema e o usuário.
- Shell é um programa de computador (software) que faz a comunicação entre o usuário e o sistema, basicamente o "mediador". Ele será o responsável por entender os comandos que estão sendo inseridos e mostrar respostas. Geralmente, Shell's oferecem uma camada de abstração ao usuário, oferecendo uma maneira muito mais fácil de se usar e entender o sistema do que a linguagem que a máquina entende, o binário. Basicamente, seria comparável a uma linguagem de programação de alto nível, que se assemelha aos idiomas humanos, facilitando quem está usando. Shell's podem ser baseados em CLI (Command Line Interface, ou em português: uma Interface de Linha de Comando), uma maneira de trocar informações a partir de texto, de se comunicar com um sistema computacional através de sentenças, ordens ou também chamado de comandos, tudo isso de uma maneira bem definida, com uma sintaxe específica, ou também podem ser baseados em GUI (GUI, Graphical User Interface, ou em português: Interface de Usuário Gráfica), um tipo de interface amigável onde é usados botões, cores, gráficos, imagens, vídeos, gifs e qualquer outro tipo de multimídia. Embora grande parte dos Shell's (e consequentemente os Consoles também) estejam monopolizados pelas implementações de interfaces CLI, interfaces GUI são outra opção. Um exemplo famoso é o Windows Shell, e todo Shell pode ser considerado um Console, dessa forma, todo Shell pode ser considerado também um Terminal.
Em resumo: Console é um dispositivo (ou conjunto deles) que fornece acesso ao usuário à um sistema, que concretiza a ação de usar um Terminal, o "algo físico", já que "Terminal" é somente um termo genérico e abstrato. Já Shell são programas que fornecem uma maneira simples de usar um Console. Em uma analogia, imagine uma casa: é dito que nesta casa exista uma maneira de entrar e sair (representando a troca de informações de um usuário e uma máquina), isto seria o Terminal. Uma das maneiras de entrar e sair é pela porta principal, isto seria um Console, pois oferece uma maneira de concretizar a ação. Já a maçaneta da porta é um Shell, pois oferece uma maneira (uma interface) simples para utilizar a porta. Agora imagine que exista um buraco no teto com uma escada de acesso, ele também seria considerado um Console, pois garante uma outra maneira de sair e entrar da casa. Já a escada seria um Shell, pois oferece uma interface simples para usar o Console (o buraco).
Em uma linha organizacional (ou hierarquia) seria algo como isso: Terminal -> Console -> Shell.