O termo 'shell' é bem nomeado. É literalmente um shell ao redor do O / S, permitindo que o usuário interaja com o computador. Quando foi originalmente concebido, havia muito pouca ou nenhuma interface gráfica de usuário (sem janelas :(). Tudo era feito na linha de comando. Mas até mesmo a linha de comando precisava de um lugar para morar. Ela vivia e ainda existe em uma concha. .
Em termos simples, para que a linha de comando seja útil, ela precisava de instruções que pudessem chamar. Então programas foram feitos para rodar dentro do shell para a linha de comando usar. Os programas foram agrupados firmemente em seus próprios pacotes e pretendiam trabalhar juntos. Eles incluem programas como "ls" e "grep", "ps", "sed", etc. Eles também incluem comandos de redirecionamento de arquivos como ">" e "<" e pipes ("|"). Mais importante, eles também incluem construções de programação como operações condicionais (if, then, else, for loops, while loops, maneiras de verificar o status retornado quando você executa uma instrução (por exemplo, se você executar "ls" encontrou algo?), Coisa Curtiu isso). Estes são os fundamentos de scripts de linha de comando (shell) mais complexos e, na verdade, é o que o interpretador de linha de comando é.
Quando alguém usa o termo 'Bash Shell', eles estão falando sobre um interpretador de linha de comando chamado 'Bash' que é executado no shell do O / S. Você poderia pensar nisso como sendo curto para 'Bash Shell Interpreter'. Há outros intérpretes como o Bourne (o Bash é um 'novo e melhorado Bourne Shell e é uma abreviação de Bourne Again Shell). Há também o C-Shell, o K-Shell (favorecido por muitos que escrevem scripts shell complexos), e outras variantes do GNU. Ao longo dos anos, tornou-se habitual referir-se ao interpretador de linha de comando específico que você está usando como shell, porque um não pode ser usado sem o outro. Mas a realidade é que eles são diferentes.
Por que eles são conhecidos como interpretadores de linha de comando e não como o shell real: é porque eles vivem no shell e interpretam todos os comandos como se estivessem rodando em um programa. E o shell não se importa com o interpretador que você executa, contanto que atenda aos padrões corretos.
E por que eles são chamados de intérpretes, é porque eles são realmente intérpretes. Mesmo se você não estiver explicitamente executando um script (e um script é realmente apenas um arquivo de texto de comandos que você cria para que você possa executar os mesmos comandos várias vezes sem ter que digitá-los novamente). Por exemplo, pegue o comando humilde 'ls'. Quando você o executa, ele retorna uma lista de arquivos. Mas como ele é executado é mais importante para a sua pergunta: Ele realmente é executado dentro do contexto do interpretador de linha de comando, mesmo que você apenas execute o que parece ser um simples comando one off. Ou seja, funciona como se fosse uma declaração em parte de um programa maior. Ele é executado como se estivesse em um arquivo de script de script de shell sem realmente estar em um arquivo de script de shell. Um arquivo de script shell anônimo como se fosse.
Qualquer coisa que você execute na linha de comando tem isso em comum (seja um único comando como 'ls' ou um arquivo de script cheio de comandos e iteradores e instruções condicionais): tudo é processado pelo interpretador de linha de comando; seja Bash, C-Shell, K-Shell (padrão no AIX btw).
Para entender o que quero dizer, crie um diretório 'test':
mkdir test
Entre e execute os seguintes comandos
grep hello *
Você receberá algum tipo de resposta como 'nenhum arquivo ou diretório'. Agora digite o comando
echo $?
($? diz, diga-me o que você encontrou no computador enigmático falar.) Você deve vê-lo retornar um número (deve ser) '2'. Esse é o código de retorno do grep que significa "nenhum tal arquivo ou diretório". Agora execute o seguinte:
echo hello > hello.txt
grep hello *
echo $?
Você verá o arquivo 'hello.txt' retornado do comando grep inicial e deverá ver agora o 'echo $?' retorne o número '0', significando que ele realmente encontrou algo.
Mesmo que esses comandos aparentemente únicos sejam executados, o interpretador de linha de comando age como se fossem parte de um programa maior e rastreie seus valores de retorno. É por isso que se você esquecer o * no final do comando grep, ele não retornará. É sabe que a afirmação é incompleta e espera mais entrada. Afinal, você poderia pedir que ele mostre os resultados de algum loop que é perfeitamente legal para escrever e executar na linha de comando.
A linha inferior é o shell é o shell, e o interpretador (qualquer que seja o nome do que você usa, 'Bash', k-shell, etc.) é diferente. Mas muitas vezes eles são usados de forma intercambiável, porque em qualquer instante eles estão completamente ligados.