O termo 'shell' é bem nomeado. É literalmente um shell em torno do sistema operacional, 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 foi feito na linha de comando. Mas até a linha de comando precisava de um lugar para morar. Vivia, e ainda o faz, em um shell .
Em termos simples, para que a linha de comando seja útil, ele precisava de instruções que pudesse chamar. Assim, foram criados programas para serem executados 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 (se, então, para loops, enquanto loops, maneiras de verificar o status retornado quando você executa uma instrução (por exemplo, se você executar "ls", encontrou alguma coisa?)), Coisa Curtiu isso). Estes são os fundamentos de scripts de linha de comando (shell) mais complexos,
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 O / S. Você pode pensar nisso como abreviação de 'Bash Shell Interpreter'. Existem outros intérpretes como Bourne (Bash é um 'Bourne Shell novo e aprimorado e é a abreviação de Bourne Again Shell). Há também o C-Shell, o K-Shell (preferido por muitos que escrevem scripts de shell complexos) e outras variantes do GNU. Ao longo dos anos, tornou-se habitual consultar o 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 intérpretes 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 qual intérprete você executa nele, desde 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 executando explicitamente um script (e um script for realmente apenas um arquivo de texto dos comandos criados para poder executar os mesmos comandos repetidamente, sem precisar digitá-los novamente). Por exemplo, tome o humilde comando 'ls'. Quando você o executa, ele retorna uma lista de arquivos. Mas como é executado é mais importante para a sua pergunta: ele realmente é executado dentro do contexto do interpretador de linha de comando, mesmo se você apenas executar o que parece ser um comando simples. Ou seja, é executado 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 de shell anônimo por assim dizer.
Tudo o que você executa na linha de comando tem isso em comum (seja um comando único como 'ls' ou um arquivo de script cheio de comandos e iteradores e instruções condicionais): tudo é processado pelo interpretador da linha de comando; seja Bash, C-Shell, K-Shell (padrão no AIX btw).
Para entender o que quero dizer, faça um diretório 'test':
mkdir test
Digite-o 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 encontrou no computador encriptado.) Você deve ver o número retornado (deve ser) '2'. Esse é o código de retorno do grep que significa 'não existe esse 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 agora deverá ver o 'echo $?' retorne o número '0', o que significa que realmente encontrou algo.
Mesmo que esses comandos aparentemente únicos sejam executados, o interpretador de linha de comando age como se fosse parte de um programa maior e controla seus valores de retorno. É por isso que se você esquecer o * no final do comando grep, ele não retornará. É sabido que a declaração está incompleta e espera mais informações. Afinal, você poderia pedir para receber os resultados de algum loop, o que é perfeitamente legal para escrever e executar na linha de comando.
Bottom line é o shell é o shell, e o intérprete (qualquer que seja o nome daquele que você usa, 'Bash', k-shell, etc.) são diferentes. Mas muitas vezes são usados de forma intercambiável, porque a qualquer instante eles estão completamente ligados.