Tutorial de Shell - Edição Installfest
Índice
- Introdução
- Terminal, prompt, linha de comando, shell, tantos nomes...
- O Shell
- Utilizando o Shell
- Shell scripting
- Programas, pacotes e gerenciadores de pacotes
Introdução
Quando conversamos com outras pessoas, utilizamos alguma língua. Essa língua, seja ela qual for, possui regras gramaticais, mas mais importante que isso, fornece vocabulário para expressar ideias, ações, objetos, etc.
Esses elementos, aliados a uma boa articulação da gramática, possibilitam a comunicação entre pessoas e realização de tarefas em grupo, por exemplo.
Inspirado nesse aspecto da nossa realidade, soluções tecnológicas seguem uma lógica muito parecido para criar uma ponte entre usuário e ferramenta (nesse caso, o computador).
O computador foi criado como uma ferramenta para realizar diferças tarefas. Inicialmente tarefas ligadas a pesquisa e ciência, mas atualmente até lazer.
Em suas primeiras versões, a interface de comunicação com um computador consistia de alavancas e botões para configurar como ele funcionária, e diferentes configurações de estados dessas peças geraravam resultados diferentes.
Conforme o computador foi evoluindo, se tornando apto a tarefas mais complexas, interfaces que abstraíssem essa complexidade se tornaram necessárias.
Para abstrair a camada física do computador, sistemas operacionais foram criados a fim de automatizar a gestão dos recursos de memória e processamento, por exemplo. Dessa forma, "em cima" do sistema operacional, algumas interfaces são implementadas para facilitar a utilização desses recursos por meio do SO.
No caso do Linux, acima do Kernel (parte central do sistema responsável pela gestão dos recursos), está disponível uma coleção de chamadas de sistema que pode ser utilizada por programas para se comunicar com o SO. Essas chamadas de sistema são encapsuladas, por exemplo, pela biblioteca padrão da linguagem C. Permitindo que programas sejam escritos utilizando as funções dessa biblioteca.
Para utilizar o SO e por fim a máquina, existe um programa que é executado por padrão na maioria dos sistemas Linux que se chama Shell. Shell significa concha, e tal qual uma concha, é como se o Shell encapsulasse, ou melhor, contivesse o sistema operacional por meio de comandos específicos.
O Shell é o que chamamos de uma interface por linha de comando (CLI) ou interface baseada em texto. Existem também interfaces gráficas (GUI) que costumam ser mais intuitivas para usuários novatos, porém mais limitadas para o interesse de usuários mais técnicos. Tal qual um clique pode significar a seleção de um arquivo ou fechar uma janela quando ocorre em cima de um ícone específico, em uma CLI comandos específicos realizam ações similares para alcançar os mesmos objetivos finais.
Além disso, o Shell também é o nome que se dá a linguagem shell, muito utilizada para escrevar programas utilitários para o sistema.
Nesse artigo vamos aprender sobre o shell, um pouco de como o Linux gerencia os programas disponíveis e como escrever scripts shell para criar utilitários simples. Apesar de introdutório, esse tutorial deveria ser suficiente para te ensinar os fundamentos necessários para começar o caminho na computação de forma com algumas vantagens.
Terminal, prompt, linha de comando, shell, tantos nomes...
Com tantos termos, é fácil se perder. Então, de forma muito muito simples: Pense no terminal como uma janela onde você consegue ver a execução de outros programas, por exemplo o Shell. Essencialmente o terminal é um programa com interface gráfica e permite que você interaja com algum Shell.
Linha de comando é o nome genérica para CLIs, e exemplos de CLIs são o promp de comando (cmd) do Windows, Shell do Linux ou MacOS ou o PowerShell também do Linux.
Exemplos de terminal são o Terminal do Windows, gnome-terminal da interface gráfica GNOME do linux e o Terminal (muito muito criativos não é mesmo) do MacOS. Existem outros terminais mais completos, com outras funcionalidades, como por exemplo o Terminator, que permite a execução de diversas sessões ao Shell.
Você talvez já deve ter escutado o termo "bash". O Bash é uma versão do Shell, e existem várias. Eu pessoalmente uso o zsh, por ser mais moderno e possuir muitas opções de customização visual (afinal deixar o terminal colorido é bem legal).
O Shell
Independente de qual Shell utilize, o básico se mantém o mesmo. Aqui vou abordar o bash, por ser o padrão na maioria das distribuições Linux. Mas, após esse tutorial, você estará apto(a) a ler a documentação de outras versões.
Vamos então aprender a utilizar o Shell para navegar pela estrutura de arquivos do nosso sistema Linux, manipular diretórios (normalmente chamados de pastas em interfaces gráficas) e arquivos e bom... basicamente é só isso que fazemos num computador se você parar pra pensar. Mas, nesse caso, ao invés de vários cliques, vamos ver como ser eficientes com comandos básicos do Shell.
Navegando o sistema
Ao abrir o terminal verá algo assim aparecendo:
Esse texto com as informações mostradas na imagem é o que chamamos de promp to shell. Basicamente é um texto fixo que mostra algumas informações uteis e a partir de onde voce digita comandos e observa resultados.
Um comando simples no Shell se parece com isso:
Usamos o comando "cd", que significa "change directory", ou "mude de diretório", para navegar entre as pastas do sistema a partir do diretório local.
Assim como em interfaces gráficas temos botões, títulos de janelas e outras coisas, na CLI do Shell, temos algumas informações uteis. Por padrão teremos algo assim: [usuario][maquina]:[diretório]$. E, literalmente, cada campo expressa o que se espera, o nome do usuário que fez log in na máquina em questão, e então em qual diretório estamos.
Ao utilizar o comando "ls", conseguimos ver o que temos nesse diretório atual e ao usar o comando "cd" acompanhado do nome do diretório para onde queremos ir, alteramos o diretório atual e portanto o contexto de execução dos comandos. Ou seja, se executarmos novamente o comando "ls", o resultado será referente ao novo diretório onde estamos agora.
O comando cd pode receber caminhos absolutos, ou seja, o caminho completo do diretório que desejamos visitar a partir da raiz do sistema (que representamos por "/"), ou caminhos relativos ao diretório atual. Se queremos acessar algum diretório dentro do atual, basta colocar o nome dele, ou o caminho até ele a partir do diretório atual. Se queremos "voltar", podemos utilizar então o diretório especial ".." que representa o diretório anterior, qualquer que seja. Dessa forma o Shell torna muito prático navegar mesmo sem saber de cor as pastas, ou diretórios que temos.
O comando ls também pode receber como argumento um caminho absoluto ou relativo e então mostrar o que existe lá, algo muito útil para "peak", ou melhor "espiar", outros diretórios sem precisar sair de onde estamos.
A raíz, a estrutura básica de arquivos Linux, a Home e gerenciamento de diretórios.
O Linux possui uma estrutura de arquivos padrão muito intuitiva. Tudo começa no "/", a partir dele temos alguns diretórios padrão.
Cada um desses diretórios possui alguma utilidade para o sistema, em "bin" encontramos os binários, ou melhor, os programas executáveis do nosso sistema. É parecido com o "Arquivos de programas" do Windows, mas não exatamente a mesma coisa. O diretório "dev" se referece aos "devices", ou "dispositivos", conectados ao sistema, por exemplo seu teclado e mouse. Não vamos entrar em detalhes no porque e como o Linux organiza essas coisas, mas é importante por agora entender que esses diretórios possuem algum significado para o sistema operacional.
O diretório "home" guarda os arquivos de cada usuário. Cada usuário possui uma pasta dentro de "home".
Dentro do diretório do usuário temos então arquivos exclusivos àquele usuário, como suas configurações, seus arquivos, programas instalados apenas para o usuário, etc. Esse diretório é representado como home do usuário pelo símbolo "~" e é normalmente o diretório padrão quando uma sessão do Shell se inicia.
Com essa base, estamos prontos para manipular diretórios.
Organizando um projeto
Digamos que você precise fazer um trabalho da faculdade, normalmente criaria uma pasta clicando com botão direito... etc etc etc.
Aqui, a partir do diretório home do seu usuário (se você se perdeu, basta executar "cd" sem argumento algum que ele voltará para o "~"), vamos executar o comando "mkdir" ("make directory", ou "crie/faça um diretório") e passar o nome da nossa pasta (diretório). Por exemplo, "exemplo_de_pasta_ou_diretorio"
Agora usamos o comando "ls" para ver que está lá e o comando "cd "exemplo_de_pasta_ou_diretorio" para acessar a pasta.
Existem diversos comandos presentes no shell, e podemos instalar mais programas. Na verdade, os comandos são também programas que o Shell chama e executa. Esses programas estão registrados na configuração do Shell, dessa forma ele consegue os encontrar e executar, e podemos também registrar nosso próprios programas nessa configuração do sistema para executar apenas com o nome deles, como fizemos com "echo", e outros.
Ainda que existam diversos comandos, e para isso recomendo fortemente algum guia de consulta de comandos linux, já vimos os pontos principais relacionados ao uso do Shell. Comandos podem ou não receber argumentos (como o texto que inserimos para aparecer na tela ou para escrever no arquivo) e opções (que normalmente são precedidos por - ou --).
Então usar o Shell é basicamente isso, ter em mente uma série de comandos e um manual de referência por perto (hoje em dia o chatgpt é incrível pra isso, mas uma lista impressa na parede é bem mais charmosa na minha opinião).
Shell scripting
Agora que aprendemos a como usar o Shell de forma interativa, ou seja, passando comandos e aguardando respostas, vamos aprender como utilizar a linguagem do Shell para escrever scripts de automação, para por exemplo, organizar arquivos em uma pasta em várias pastas.
Scripts desse tipo são muito utilizados para criar scripts de configuração automática de máquinas, fazer o processo de instalação de programas e sistemas complexos ou até mesmo facilitar o funcionamento de aplicações, utilizando a interface nativa do Shell, ao invés de precisar implementar soluções novas para interagir com as chamadas de sistema.
Programas, pacotes e gerenciadores de pacotes
Como citado antes, podemos escrever nossos próprios programas para extender as capacidades do Shell, mas também podemos instalar programas usando gerenciador de pacotes. Esses programas são normalmente associados a configuração do sistema de tal forma que podemos executá-los pelo Shell como se fossem comandos do Shell.
Um exemplo é o programa cowsay, que permite escrever mensagens como diálogos de uma vaca. Completamente inútil não é? Mas isso é muito mais legal que clicar em janelas.. talvez.. eu acho...
Afinal, qual motivação em aprender o Shell se não algo assim?
Mas para saber mais sobre isso, precisamos de um artigo especial para falar de Linux, Distros e como fazer coisas na sua distro favorita.