O shell é a interface de linha de comando que permite interagir com o sistema operacional Unix/Linux. Entender sua história é essencial para apreciar as ferramentas que usamos hoje e suas filosofias de design. Nesta aula, vamos percorrer a evolução do shell, desde os primeiros dias do Unix até o Bash moderno, e discutir as diferenças entre os principais shells e o que o futuro reserva.

O shell não é apenas um interpretador de comandos; é também uma linguagem de programação poderosa para automação de tarefas. Conhecer sua origem ajuda a entender por que certos comportamentos existem e como o Bash se tornou o shell padrão na maioria das distribuições Linux.

Introdução

O shell surgiu como uma necessidade de interagir com o sistema operacional Unix de forma mais produtiva que a simples execução de programas individuais. O primeiro shell, chamado Thompson shell (sh), foi criado por Ken Thompson em 1971 e oferecia recursos básicos como redirecionamento de entrada/saída e pipes. No entanto, era limitado para scripts complexos.

Em 1977, Stephen Bourne criou o Bourne shell (também chamado sh) no Bell Labs, que introduziu conceitos como variáveis, estruturas de controle (if, for, while) e funções, tornando-o adequado para scripts. O Bourne shell foi distribuído com o Unix Version 7 e se tornou o shell padrão por muitos anos. Seu design influenciou profundamente todos os shells posteriores.

Pessoas e cronologia (Bourne shell, Brian Fox, GNU)

O Bourne shell foi um grande avanço, mas tinha limitações, como falta de recursos interativos (histórico de comandos, edição de linha). Isso motivou o desenvolvimento de outros shells, como o C shell (csh) de Bill Joy em 1978, que trouxe recursos interativos mas com sintaxe diferente. O Korn shell (ksh) de David Korn em 1983 combinou a sintaxe do Bourne com recursos interativos do C shell.

No final dos anos 80, o projeto GNU precisava de um shell livre que substituísse o Bourne shell. Brian Fox, funcionário da Free Software Foundation, começou a escrever o Bourne Again SHell (bash) em 1987. O bash foi projetado para ser compatível com o Bourne shell, mas incorporar recursos do ksh e csh. Sua primeira versão beta foi lançada em 1989, e desde então se tornou o shell padrão na maioria das distribuições Linux e no macOS.

O bash continuou a evoluir sob a liderança de Chet Ramey, que assumiu a manutenção em 1992. Hoje, o bash é um software maduro, com versões estáveis lançadas regularmente. Sua história está intrinsecamente ligada ao movimento do software livre e ao sucesso do Linux.

sh vs bash vs outros shells

O comando sh historicamente se refere ao Bourne shell, mas em muitos sistemas Linux, /bin/sh é um link simbólico para /bin/bash (ou, em alguns casos, para dash). O bash é um superconjunto do sh: ele executa scripts sh, mas oferece extensões como arrays, substituição de processo e expressões regulares. Para portabilidade, scripts que usam apenas recursos POSIX podem usar #!/bin/sh, mas se usam extensões bash, devem usar #!/bin/bash.

Outros shells populares incluem:

  • Zsh (Z shell): foco em interatividade, com temas, plugins e autocompletar avançado. É o shell padrão no macOS desde Catalina.
  • Fish (Friendly Interactive Shell): destaca-se por sugestões automáticas, sintaxe colorida e configuração fácil, mas não é compatível com POSIX.
  • Dash (Debian Almquist Shell): shell leve e rápido, usado como /bin/sh no Debian e Ubuntu para scripts de inicialização.

A escolha do shell depende do caso de uso: para scripts portáteis, prefira sh (POSIX); para scripts avançados, use bash; para uso interativo, considere zsh ou fish.

Futuro

O bash continua sendo amplamente utilizado, mas seu desenvolvimento é conservador. Novos recursos são adicionados com cuidado para manter a compatibilidade. Enquanto isso, shells como zsh e fish ganham popularidade entre desenvolvedores por sua usabilidade. O futuro pode trazer shells com melhor integração com containers, suporte nativo a JSON ou YAML, e maior segurança. No entanto, o bash provavelmente permanecerá como o padrão em servidores e sistemas embarcados devido à sua ubiquidade e estabilidade.

A tendência é que os shells evoluam para oferecer melhor experiência interativa, mantendo a compatibilidade com scripts existentes. Iniciativas como o 'Nushell' (nu) propõem um shell moderno com modelo de dados estruturados, mas ainda são nicho. Por enquanto, o bash continua sendo a habilidade fundamental para qualquer profissional de Linux.

Boas práticas

Ao escrever scripts, sempre especifique o shebang correto (#!/bin/bash ou #!/bin/sh) e evite extensões não portáteis se precisar de compatibilidade. Use ferramentas como shellcheck para analisar scripts e seguir boas práticas. Além disso, conheça a história do shell para entender por que certos comandos funcionam de determinada maneira.

Referências

Exercícios

  1. Qual foi o primeiro shell do Unix e quem o criou?

    ✓ Resposta: O primeiro shell foi o Thompson shell, criado por Ken Thompson em 1971.
  2. Em que ano o Bourne shell foi lançado e qual sua principal contribuição?

    ✓ Resposta: O Bourne shell foi lançado em 1977 por Stephen Bourne, e sua principal contribuição foi introduzir variáveis, estruturas de controle e funções, tornando o shell adequado para scripts.
  3. Quem criou o Bash e qual era seu objetivo?

    ✓ Resposta: O Bash foi criado por Brian Fox em 1987 como parte do projeto GNU, com o objetivo de ser um shell livre compatível com o Bourne shell, incorporando recursos do ksh e csh.
  4. Qual a diferença entre #!/bin/sh e #!/bin/bash?

    ✓ Resposta: #!/bin/sh indica que o script deve ser executado pelo shell padrão do sistema (geralmente bash ou dash), que segue o padrão POSIX. Já #!/bin/bash especifica explicitamente o Bash, permitindo usar extensões como arrays e substituição de processo.
  5. Cite dois shells modernos focados em interatividade e suas características principais.

    ✓ Resposta: Zsh (Z shell): foco em temas, plugins e autocompletar avançado. Fish: sugestões automáticas, sintaxe colorida e configuração fácil.