O GNU

O advento do CTSS alterou fundamentalmente o paradigma de interação Humano-Computador, dando início a tentativas por outros de criar formas melhores de interação Humano-Computador. Dessa linhagem de tentativas, e após a experiência do projeto Multics, surgiu o Unix.

O crescimento do Unix foi impulsionado por uma peculiaridade jurídica. Devido ao Decreto de Consentimento de 1956, a AT&T (detentora do Bell Labs) estava proibida pelo governo americano de atuar comercialmente fora do setor de telecomunicações. Consequentemente, ela não podia vender o Unix como produto. A solução foi licenciar o software para universidades apenas pelo custo da mídia, sem oferecer suporte técnico. Isso forçou os usuários a colaborarem entre si, compartilhando correções e melhorias, fomentando uma cultura de desenvolvimento comunitário.

O cenário mudou na década de 1980, quando a AT&T foi desmembrada e liberada das restrições comerciais. O Unix tornou-se um software proprietário, fechado e pago.

Em algum momento, Richard Stallman deparou-se com uma falha no driver de uma impressora Xerox. Ao solicitar o código-fonte para corrigir o problema (como era de costume as pessoas fazerem, já que não se tinha suporte), o acesso lhe foi negado sob a justificativa de segredo industrial. Agora ninguém mais podia compartilhar as modificações e melhorias do UNIX para terceiros.

Em 27 de setembro de 1983, Richard publicou na Usenet — o principal sistema de discussão em rede da época — o que daria início ao GNU:

A partir do próximo Dia de Ação de Graças, vou escrever um software completo compatível com Unix chamado GNU (sigla para GNU’s Not Unix), e o compartilharei livremente com qualquer um que possa usá-lo. Contribuições em termos de tempo, dinheiro, programas e equipamentos são muito bem-vindas. (…) O GNU rodará programas Unix, mas não será idêntico ao Unix. (…)

Eu sou Richard Stallman, inventor do original e muito imitado editor EMACS (…) Eu não posso, em boa consciência, assinar um acordo de não quebra ou um acordo de licença de software. Então, para que eu posso continuar a usar computadores sem violar meus princípios, eu decidi reunir um corpo suficiente de software livre de tal modo que eu esteja apto a passar sem o uso de qualquer software que não seja livre.

Texto retirado do GNU.org

Acho que ele ficou “PUTO!” com a UNIX.

Então aqui tenho o que preciso para entender a parte GNU de “Shell GNU”. Agora volto ao que interessa, ao Shell.


O Shell

Diagrama retirado da wiki do curso.

Esse diagrama gerou-me muitas dúvidas. Até que ponto o Shell — iniciado com o RUNCOM — difere do Shell Script, das implementações de Shell (e.g. Bash, Zsh) e do Terminal?

O Shell idealizado por Louis Pouzin é, em essência, o programa que interpreta comandos para o núcleo (kernel) e retorna as respostas ao usuário. Já o Shell Script é a linguagem de alto nível, como define o professor Blau, utilizada pelo usuário para redigir instruções ao interpretador.

O terminal é o ambiente onde se digitam os comandos em Shell Script. Ele trouxe-me outra dúvida, pois comumente utiliza-se o termo “Emulador de Terminal”. Por que “emulador”? Qual seria o verdadeiro terminal?

O terminal originário é o Teletipo (Teletypewriter): a “máquina de escrever” na qual o usuário digitava o comando e recebia a resposta mecanicamente impressa. Posteriormente, surgiram os monitores de vídeo — conhecidos como “terminais burros”. Estes simulavam a interação papel-máquina e são utilizados pelo kernel até hoje, operando em modo de texto puro (os mais modernos suportam cores). Os Emuladores de Terminal surgem para simular esses terminais burros dentro de um ambiente gráfico (ex: foot, kitty, alacritty).

Em síntese:

  • Shell: O programa interpretador que faz a ponte entre o Usuário e o Kernel.
  • Shell Script: A estrutura sintática e lógica compreendida pelo Shell.
  • Terminal: A interface visual e de entrada/saída para o Shell.
  • Plataforma: É o conjunto de Utilitários e Bibliotecas de Sistema (como o projeto GNU) que operam sobre o Kernel.

Softwares como Bash, Zsh e Ksh são implementações completas do conceito de Shell.

Continuando: História do Shell + POSIX

Embora Glenda Schroeder e Roy Feiertag tenham escrito o primeiro Shell para o Multics (baseado nas ideias de Pouzin), aquele era um sistema extremamente complexo. Quando Ken Thompson e Dennis Ritchie abandonaram o Multics para criar o Unix, eles levaram consigo a filosofia de Pouzin, mas sob o prisma da simplificação.

1971: Thompson escreve o primeiro Shell (sh) para o Unix V1. Ainda não era uma linguagem de programação completa, apesar de introduzir mecanismos seminais como o redirecionamento de entrada e saída (< e >) e os filtros (pipes |), faltavam-lhe, por exemplo, estruturas de controle de fluxo (if, for) robustas.

1979: Stephen Bourne lançou o Bourne Shell (sh) integrando o Unix Versão 7. Bourne transformou o Shell em uma linguagem de programação algorítmica, introduzindo o uso de variáveis, laços de repetição (loops) e condicionais. Esta versão estabeleceu a base sintática (o padrão POSIX) que herdamos até hoje.

1978: Bill Joy desenvolve o ‘csh’ (C Shell) para o BSD Unix, introduzindo uma sintaxe inspirada na linguagem C e recursos como histórico de comandos e “aliases”.

1983: David Korn, no Bell Labs, buscando unir o melhor dos dois mundos, lançou o Korn Shell (ksh). Ele combinou o Bourne Shell com o csh.

Nos anos 80, quando a AT&T começou a licenciar o código para várias empresas. Cada uma criou sua própria versão, otimizada para seu hardware e com melhorias proprietárias.

Sistema Unix Desenvolvedor Características Principais Shell Padrão Típico
System V AT&T A “linha principal” comercial. Bourne Shell (sh)
BSD (Berkeley Software Distribution) UC Berkeley Introduziu sockets, vi, csh. C Shell (csh)
HP-UX Hewlett-Packard Para servidores HP. sh + extensões
AIX IBM Para mainframes IBM. Korn Shell (ksh)
Solaris Sun Microsystems Sucesso em servidores. Bourne Shell (sh) e depois ksh

Então, script escrito para o sh do AIX podia falhar no sh do HP-UX. Era a “Guerra dos Unixes”: uma batalha por mercado que fragmentava a tecnologia.

Para resolver essa Torre de Babel, o IEEE (Instituto de Engenheiros Eletricistas e Eletrônicos) criou um comitê para definir um padrão de interface portável para sistemas operacionais, o POSIX (Portable Operating System Interface).

A primeira especificação, POSIX.1-1988, definiu um padrão para a linguagem de shell e utilitários padrão. O Bourne Shell (sh) de 1979, foi escolhido como a base.

1989: É neste cenário, mas com uma base comum agora definida pelo POSIX, que Brian Fox lança o Bash (Bourne-Again Shell) para o projeto GNU. Ele incorporou os recursos interativos mais apreciados do csh e do ksh.