MODIFIQUEI o script do DIOLINUX
Bom pessoal, estamos acabando essa trend de posts sobre Shell Script, já que estamos chegando ao fim de Outubro, o mês da Hacktoberfest. Antes de finalizar, não poderia deixar de comentar sobre algumas mudanças que fiz no script do Dionatan, do canal Diolinux. Acho interessante comentar sobre isso, pois assim é possível entender o porque de cada mudança.
Que script é esse?
O Dionatan fez esse vídeo falando sobre o script em si, qual o seu objetivo e o que ele faz. Além disso, recebi o convite dele para dar uma olhada e tentar ajudar a melhorar o mesmo. Foi isso que fizemos!
Este é o link direto para o GitHub com o script. Caso você queira contribuir também, sinta-se à vontade.
Oportunidades de melhoria e mudanças!
IMPORTANTE! Nada do que eu estou falando aqui tem o objetivo de desmerecer o trabalho do Dionatan, é apenas algumas observações que fiz baseado no que aprendi com outros programadores Shell.
Aqui você consegue ver a o primeiro commit no repositório com a versão inicial do mesmo. Para não me estender muito, aqui vai uma lista de coisas que notei e que poderíamos melhorar:
- Usar sempre "!/usr/bin/env bash" como shebang, pois o comando env deixará portável (busca na variável PATH).
- Variáveis globais em maiúsculo com nome descritivo.
- O ideal é sempre que possível, manter as variáveis entre aspas duplas.
- Separar o código entre: variáveis, funções, testes e execução (ainda podemos melhorar essa parte).
- Como havia muitos “apt install” e o nome do programa, ficou mais fácil usar uma lista com o nome dos programas. Caso alguém queira adicionar algo a mais, só adicionar na lista.
- Os programas agora são validados se já estão instalados. Caso contrário, faz a instalação.
Analisando uma parte do código
Para não ficar apenas falando das mudanças, vamos dar uma olhada em um trecho do código:
for nome_do_programa in ${PROGRAMAS_PARA_INSTALAR[@]}; do
if ! dpkg -l | grep -q $nome_do_programa; then # Só instala se já não estiver instalado
apt install "$nome_do_programa" -y
else
echo "[INSTALADO] - $nome_do_programa"
fi
done
É bem simples de entender a lógica. Basicamente, estamos lendo a lista PROGRAMAS_PARA_INSTALAR que foi declarada lá no começo do código com todos os programas que devemos instalar usando o “apt”.
Para cada um deles, usamos o comando “dpkg -l” que vai listar todos os programas instalados no equipamento, enviamos o stdout para o “grep -q” que vai fazer o filtro no modo quiet, isto é, não vai mostrar nada na tela. Ué, mas como eu consigo validar se é falso ou não? Usando o exit code. Veja:
O código “0” significa verdadeiro e o código “1” significa falso. O if já entende isso automaticamente, então não precisamos comparar com nada. Se for verdadeiro, significa que já está instalado, por isso adicionamos um “!” na frente para negar a condição. Ou seja, se ele não está instalado ele retornaria falso, mas com “!” ele retorna verdadeiro.
Então, se for verdadeiro, instala com “apt install” o programa que está sendo analisado no for. Caso contrário, apenas mostra na tela e vai para o próximo. Ficou mais legível e mais fácil de expandir, se quiser adicionar mais um programa é só colocar na lista PROGRAMAS_PARA_INSTALAR.
O que podemos melhorar ainda?
Antes de mais nada, fica o convite para que você ajude a melhorar o código! 🙂
Acredito que ainda podemos adicionar:
- Construir um README explicando exatamente o que ele faz e como utilizar, de forma que mais pessoas consigam entender facilmente.
- Realizar alguns testes de requisitos, por exemplo, está executando com o usuário root? Caso contrário, já sai do programa.
- Usar algum tipo de validação na linha “sudo dpkg -i $DIRETORIO_DOWNLOADS/*.deb” para verificar se o programa já não está instalado.
- Pesquisar sobre o wine se não podemos adicionar junto na lista.
- Criar um log de erros para facilitar o troubleshooting.
Deixe sua sugestão aí e vamos trabalhar juntos.
Conclusão
Sinceramente, comece a contribuir galera. Muitas vezes a gente acaba se boicotando, achando que não temos potencial e nem conhecimento. Qualquer ajuda é bem-vinda, seja dando ideias, reportando bugs, criando documentação. Só escrevi isso para incentivar vocês. Valeu.
Me siga no Instagram onde eu faço conteúdos da minha rotina diária.
Participe dos nossos grupos no Telegram e Facebook! 🙂
Se tiver alguma dúvida ou sugestão de conteúdo, por favor, comente!