# Shell (computação)

Na informática, o shell (em português: "casca" e "concha") é uma interface de usuário para acessar os serviços de um sistema operacional de um dispositivo computacional (computador e smartphone por exemplo), que no geral possuem uma interface de linha de comando (CLI) ou uma interface gráfica de usuário (GUI), dependendo da função e operação particular de um computador. O macOS e o Windows são exemplos de sistemas operacionais amplamente utilizados através de interfaces gráficas.
Este tipo de interface de usuário é chamado de shell/casca porque é a camada mais externa em torno do núcleo do sistema operacional (kernel).
Na interface no formato de linha de comando (CLI) o utilizador digita vários comandos (texto simples) em sucessivas linhas no shell.

## Visão Geral

No mundo Unix, o termo Shell é mais usualmente utilizado para se referir aos programas de sistemas do tipo Unix que podem ser utilizados como meio de interação entre interface de usuário para o acesso a serviços do kernel no sistema operacional. Este é um programa que recebe, interpreta e executa os comandos de usuário, aparecendo na tela como uma linha de comandos, representada por um interpretador de comandos, que aguarda na tela os comandos do usuário. Em aplicativos, o "Shell" é também usado para descrever aplicações, incluindo software que é "construído em torno" de um componente específico, como navegadores e clientes de e-mail que são, em si mesmos, "shells" para motores de renderização HTML.
A escolha ideal de interface com o usuário depende da função no computador em particular a operação. CLIs permitem algumas operações a serem executadas mais rapidamente, reorganizando grandes blocos de dados, por exemplo. CLIs podem ser melhores para os servidores que são gerenciados por especialistas: administradores, enquanto GUIs oferecem simplicidade e facilidade de uso e seria mais adequado para edição de imagem, CADD e editoração eletrônica. Na prática, muitos sistemas fornecem ambas a interfaces de usuário que podem ser chamadas em uma base de comando por comando. O Windows xxx é o exemplo mais óbvio, com o seu "prompt de comando" e no modo normal "windows". Não é nenhum exagero dizer que tanto a Apple Macintosh OS xxx e Microsoft Windows xxx revolucionaram a computação doméstica, ajudando os usuários relativamente inexperientes com interface de um PC usando uma GUI.
Em sistemas especialista, um shell é um pedaço de software que é um sistema especialista "vazio", sem a base de conhecimento para qualquer aplicação em particular.

## História

O primeiro shell Unix, o sh criado por Ken Thompson, foi modelado depois do shell Multics, em si modelado com base no programa RUNCOM de Louis Pouzin. O sufixo 'rc' presente em alguns arquivos de configuração do unix (".vimrc", ".bashrc"), é um remanescente do ancestral RUNCOM dos shells Unix.
Quase todos os shells dos sistemas operacionais da década de 1970 podem ser usados de duas formas: interativa e modo batch(lote). O modo batch envolve estruturas, condicionais, variáveis e outros elementos de linguagem de programação; alguns tem apenas o necessário para um propósito específico, outras atendem propósitos mais diversos e sofisticados.

## Shells de texto (CLI)

A tradução de Shell para português neste caso, pode significar "concha" ou "casca". Na informática o Shell, de maneira genérica, é um programa que intermedeia o contato entre o usuário e o computador. É a interface entre o usuário e o sistema operacional (kernel). Aqui descreveremos o termo mais comum usado cotidianamente, que se refere aos interpretadores de comandos dos sistemas Unix e tipo Unix.
A interface de linha de comando (Command-line interface - CLI em inglês) é um shell do sistema operacional que utiliza caracteres alfanuméricas digitadas em um teclado para fornecer instruções e dados para o sistema operacional, de forma interativa. Por exemplo, um teletipo pode enviar códigos que representam combinações de teclas para um programa interpretador de comandos em execução no computador, o interpretador de comandos analisa a seqüência de teclas e responde com uma mensagem de erro se não puder reconhecer a sequência de caracteres, ou pode realizar algum outro programa de ação, tais como o carregamento de um programa de aplicação, listando os arquivos, login de um usuário e muitos outros. Sistemas operacionais como o UNIX tem uma grande variedade de programas shell com diferentes comandos, sintaxe e capacidades. Alguns sistemas operacionais tiveram apenas um único estilo de interface de comando, sistemas operacionais de commodities, como MS-DOS veio com uma interface de comando padrão, mas as interfaces de terceiros também foram frequentemente disponíveis, fornecendo recursos ou funções, como menuing ou execução remota de programas adicionais.
Programas de aplicação também pode implementar uma interface de linha de comando. Por exemplo, em sistemas Unix-like, o telnet programa tem uma série de comandos para controlar um link para um sistema de computador remoto. Uma vez que os comandos para o programa são teclas digitadas como os dados a serem transmitidos para um computador remoto, alguns meios de distinguir os dois são necessários. Uma sequência de escape pode ser definida, usando uma combinação de teclas especiais no local que nunca é passado, mas sempre interpretada pelo sistema local. O programa torna-se restrito, alternando entre interpretar os comandos do teclado ou passando batidas de teclas como os dados a serem processados.
Uma característica de muitos shells de linha de comando é a capacidade de salvar sequências de comandos para re-uso. Um arquivo de dados pode conter sequências de comandos que o CLI podem ser feitas a seguir como se digitado pelo usuário. Recursos especiais no CLI pode aplicar quando se está levando a cabo estas instruções armazenados. Esses arquivos em Batch (arquivos de script) pode ser usado repetidamente para automatizar operações de rotina, como a inicialização de um conjunto de programas quando o sistema é reiniciado. O shell de linha de comando pode oferecer recursos como completação de linha de comando, onde o intérprete se expande comandos com base em uma entrada de alguns caracteres pelo usuário. A intérprete de linha de comando pode oferecer uma função de histórico, de modo que o usuário pode chamar comandos anteriores emitidos para o sistema e repeti-los, possivelmente com alguma edição.
Uma vez que todos os comandos para o sistema operacional tinha de ser digitado pelo usuário, nomes de comandos curtos e sistemas compactos para que representam opções do programa eram comuns. Nomes curtos eram às vezes é difícil para um usuário para se lembrar, e os sistemas de início não tinha os recursos de armazenamento para fornecer um guia de instruções do usuário on-line detalhado. Existem diversas implementações de Shell, dentre os quais podemos mencionar o csh, tcsh, sh, bash, ksh, zsh e muitos outros. Cada um pode executar comandos gerais do sistema de maneira semelhante, porém possuem estruturas e comandos próprios que os diferenciam. Outra grande diferença entre os diversos tipos de Shell são as facilidades que eles oferecem para o reaproveitamento de comandos e manipulação da linha de comandos.
Todo o usuário em sistemas Unix e similares tem um shell associado a si em seu cadastro. Podemos dizer que o Shell do usuário "fulano" é o csh, por exemplo, se este for o Shell cadastrado para o usuário. Embora o cadastro só permita associar um shell a cada usuário é muito simples passar de um shell para outro, passando a usar outro interpretador de comandos, bastando para isso chamar o outro shell desejado, da mesma maneira que qualquer comando é executado. Se um usuário, por exemplo, está no shell "sh" e executa o comando "csh", passa neste momento a usar o shell "csh" como interpretador de comandos até que saia dele com o comando "exit" ou outro comando para sair do shell.

## Shells gráficos

A interface gráfica do usuário (Graphical User Interface - GUI em inglês) representa programas e dados através de símbolos visuais em vez de texto. Interfaces gráficas tornaram-se viáveis com a diminuição do custo do hardware de computação gráfica interativa. Interfaces gráficas desenvolvem a metáfora de um "ambiente de trabalho eletrônico", onde os arquivos de dados são representados como se fossem os documentos em papel em uma mesa, e os programas de aplicação semelhante tem representações gráficas em vez de serem chamados por nomes de comandos.