Uma das coisas mais legais do Bash é o poder de automatizar tarefas, até mesmo na própria linha de comando. Hoje você vai aprender a criar um simples Shell Script para instalar um programa.
Para você entender o conceito, vamos dar um exemplo com um programa popular e simples, o GIMP. O GIMP é um manipulador de imagens que está no repositório de todas as distros Linux praticamente, como exemplo nos comandos vamos usar o gerenciador de pacotes "apt", comum no Debian, Ubuntu, Linux Mint e derivados, apesar disso, entendendo o conceito, você pode aplicar em qualquer distro, basta entender o gerenciador de pacotes dela e os comandos que ele aceita.
Claro, o GIMP pode ser instalado por centrais de apps sem comandos, pode ser também instalado com um simples # apt install gimp mas a intenção é te mostrar como você pode estruturar um script para automatizar a instalação de qualquer programa ou de vários ao mesmo tempo.
Vamos imaginar que você queria instalar o gimp a partir do terminal.
Muito provavelmente os passos que você dará serão:
1) Atualizar os repositórios
$ sudo apt-get update
2) Instalar possíveis atualizações do sistema:
$ sudo apt-get dist-upgrade -y
3) Efetivamente instalar o pacote.
$ sudo apt-get install gimp
O processo manual da instalação de um programa pode levar algum tempo, pois você deverá esperar que o primeiro comando termine sua execução para digitar o próximo.
Nem sempre atualizar repositórios é rápido e portanto é o seu tempo que está sendo gasto esperando algo que poderia facilmente ser automatizado.
O primeiro nível de automatização que poderíamos fazer aqui é criar uma fila de comandos (chamadas de listas) que serão executados pelo Bash em sequência.
Para isso basta separar os comandos com um ponto e vírgula:
sudo apt-get update ; sudo apt-get dist-upgrade -y ; sudo apt-get install gimp -y
Apesar de já automatizar um pouco o processo, não há praticamente nenhuma lógica envolvida.
Você muito provavelmente não deseja executar um "dist-upgrade" se o "update" falhar antes por qualquer motivo. Certo?
Aqui chegamos no nosso segundo nível de automatização. Em vez de usar o ponto e vírgula, podemos separar os comandos com "&&", e desta forma o Bash somente executará o comando seguinte se o anterior finalizar a execução com sucesso.
sudo apt-get update && sudo apt-get dist-upgrade -y && sudo apt-get install gimp -y
Agora já melhoramos bastante o processo, porém no caso de algum dos comandos retornar falha, esta fila de comandos simplesmente para de ser executada sem qualquer tipo de aviso mais elaborado para o usuário.
É possível em linha de comando adicionar mais lógica para continuar aperfeiçoando este nosso procedimento, porém este é aquele momento em que talvez seja mais proveitoso se criar um script de verdade e deixar o processo legível, em vez de simplesmente criar uma "tripa" de comandos que depois poderá dificultar a sua vida na hora de encontrar e consertar qualquer erro.
Para este nosso exemplo, usaremos o próprio "if" do Bash (que é uma estrutura de condicional explicada brevemente neste vídeo aqui)
Basta criar um arquivo de texto que você pode 'chamar do que quiser .sh", tipo "batatinha_quando_nasce.sh" e inserir os dados que vamos te mostrar. Tá bom, talvez seja melhor criar um arquivo chamado instala-pacote.sh o seguinte conteúdo:
#!/bin/bash
echo Atualizando repositórios..
if ! apt-get update
then
echo "Não foi possível atualizar os repositórios. Verifique seu arquivo /etc/apt/sources.list"
exit 1
fi
echo "Atualização feita com sucesso"
echo "Atualizando pacotes já instalados"
if ! apt-get dist-upgrade -y
then
echo "Não foi possível atualizar pacotes."
exit 1
fi
echo "Atualização de pacotes feita com sucesso"
# note que $1 aqui será substituído pelo Bash pelo primeiro argumento passado em linha de comando
if ! apt-get install $1
then
echo "Não foi possível instalar o pacote $1"
exit 1
fi
echo "Instalação finalizada"
Veja que utilizamos o operador "!" após o "if" para inverter o resultado do comando seguinte, portanto o conteúdo das condicionais (código que está entre o "then" e o "fi") somente será executado caso os comandos falhem na execução. Também utilizamos o comando "exit 1" para pedir ao Bash que interrompa a execução do script em caso de falha.
Para executar o script basta rodar a seguinte linha:
sudo bash instala-pacote.sh gimp
Desta forma podemos utilizar o mesmo script para qualquer pacote, e o "sudo" só precisa ser invocado uma vez. Basta passar o nome do pacote desejado em linha de comando e ver o Bash fazer o resto sozinho.
É possível melhorar e incrementar o script de diversas maneiras. Podemos imprimir mensagens com cores, suprimir a saída em tela do comando apt-get para facilitar a leitura, dentre outras coisas.
Basta ter criatividade e dominar a linguagem do Shell Script para poder automatizar praticamente o que você quiser.
Leia também: 5 motivos para aprender Shell Script
Outra coisa que você pode fazer é incluir dentro do Shell Script os comandos para a instalação do pacote em específico, assim você pode rodar apenas o Shell Script e ele se encarrega de fazer a instalação para você.
Você pode por exemplo criar um script de pós formatação para o seu sistema, acrescentando repositórios, pacotes e programas que você normalmente usa, incluindo as opções para fazer a atualização do sistema e apenas rodar um Shell Script depois de instalar a sua distro e ir tomar café enquanto seu sistema é montando automaticamente. É mais do que bacana!
Nós lançamos nesta semana o nosso curso avançado de Shell Script, onde você vai aprender coisas como esta deste post e muitas outras para automatizar a sua vida de usuário Linux, as matrículas estão abertas até Quinta-feira, dia 15 de Junho e tem promoção especial para quem comprar hoje até a meia-noite. Corre lá pra conferir antes que fechem as matrículas.
Até a próxima!
_____________________________________________________________________________Viu algum erro ou gostaria de adicionar alguma sugestão a essa matéria? Colabore, clique aqui.
This post first appeared on Diolinux - Open Source, Ubuntu, Android E Tecnologia, please read the originial post: here