Aprendendo a melhorar os seus scripts
Qual é o processo de pensamentos que leva uma pessoa a criar um script para fazer tarefas longas e cansativas em tarefas simples e rápidas? Nesse artigo eu quero levar você para dentro do cérebro de um criador de scripts para que você possa pensar como um programador e criar os seus próprios scripts de uma forma eficaz e elevar o nível para avançado. Caso você seja um novato e tem medo do terminal, esse artigo pode mudar o seu ponto de vista e te dar coragem para criar seus próprios scripts.
Parte 5: Melhorando o script
- Que legal, conseguimos fazer um script que funciona...
- Sim pequeno Jedi, mas a ideia do script não é só fazer o script funcionar e sim melhorar ele.
- Sim Maurício, mas fizemos o script pegar a informação offline invés de online e ainda conseguimos fazer o script reconhecer qual é a versão e quando que ele tem que baixar... está bom.
- Pequeno Jedi, o bom é inimigo do melhor.
Vamos pensar nos problemas que podemos ter com esse script, primeiro estamos falando de atividades administrativas, instalar aplicativos, parar e reiniciar serviços do sistema. Esse script tem que saber quem está chamando ele.
Para isso vamos adicionar um "if" que se o usuário for administrativo, ele roda, se não ele recusa rodar.
Outra coisa que podemos fazer para melhorar a leitura deste código é diminuir o tamanho do "if" que executa os comandos de instalação. Para isso devemos criar uma função com todos os comandos que queremos usar e chamar essa função se a condição permitir.
Também podemos usar operadores lógicos & - && - | - || - ;
Fazendo isso podemos tirar todos if, then, else e fi. [ponto e virgula] ; vai executar os dois comandos um após o outro. Só que para executar o segundo ele espera o primeiro terminar.
[ and duplo ] && só roda o segundo comando se o primeiro funcionar ou ter um resultado positivo.
[ dupla barra vertical ] || só vai rodar o segundo comando se o primeiro comando falhar. Se o primeiro comando funcionar então o segundo comando não roda.
[ and ] & vai iniciar o primeiro e o segundo comando juntos, independente do primeiro ter funcionado ou não.
[ barra vertical ] | vai executar os dois comandos passando o resultado do primeiro como um argumento para o segundo.
Eu sei, isso que eu expliquei soa confuso agora, mas leia novamente essa explicação acima e pratique nos seus scripts... com o tempo a informação vai fazer sentido.
Comentários é outra coisa que podem ajudar no futuro, se você tiver que fazer alguma alteração no seu código. Principalmente se seus scripts são grandes e complexos. Um comentário em bash é antecipado por "#".
- O código ficou mais bonitinho, mas é só isso? Qual foi a melhora deste script além da aparência?
- Vamos testar as 4 versões do script para ver quanto tempo demora para executá-los, tem uma ferramenta chamada "time" que diz quanto tempo um programa ou script demora para terminar a execução.
time sudo emby-update
Versão [*****] = 26 segundos
Baixando e instalando toda vez que é chamado.
Versão funcional online = 1.128 segundos
Buscando a informação da versão no site.
Versão funcional offline = 0.040 milésimos de segundo
Buscando a versão no arquivo de texto.
Versão melhorada = 0.019 milésimos de segundos
Última versão mais enxuta.
Eu entendo que esse script parece mais bonito, porém quando você tem um script longo onde a mesma atividade se repete várias vezes e muitos "ifs", ao fazer essa limpeza, além de ficar mais compreensível, vai ficar mais fácil de fazer manutenção e vai executar de forma mais eficiente.
Espero que tenham gostado e aprendido algo novo. Fiquem à vontade para comentar e espalhar esse artigo aos futuros cowboys do teclado.
- Sim pequeno Jedi, mas a ideia do script não é só fazer o script funcionar e sim melhorar ele.
- Sim Maurício, mas fizemos o script pegar a informação offline invés de online e ainda conseguimos fazer o script reconhecer qual é a versão e quando que ele tem que baixar... está bom.
- Pequeno Jedi, o bom é inimigo do melhor.
Vamos pensar nos problemas que podemos ter com esse script, primeiro estamos falando de atividades administrativas, instalar aplicativos, parar e reiniciar serviços do sistema. Esse script tem que saber quem está chamando ele.
Para isso vamos adicionar um "if" que se o usuário for administrativo, ele roda, se não ele recusa rodar.
if [ "${USER}" != "root" ]
then echo "O usuario ${USER} não esta autorizado a executar este script, use sudo $0 ou peça ao administrador para executar."
exit 1
fi
Outra coisa que podemos fazer para melhorar a leitura deste código é diminuir o tamanho do "if" que executa os comandos de instalação. Para isso devemos criar uma função com todos os comandos que queremos usar e chamar essa função se a condição permitir.
Também podemos usar operadores lógicos & - && - | - || - ;
Fazendo isso podemos tirar todos if, then, else e fi. [ponto e virgula] ; vai executar os dois comandos um após o outro. Só que para executar o segundo ele espera o primeiro terminar.
[ and duplo ] && só roda o segundo comando se o primeiro funcionar ou ter um resultado positivo.
[ dupla barra vertical ] || só vai rodar o segundo comando se o primeiro comando falhar. Se o primeiro comando funcionar então o segundo comando não roda.
[ and ] & vai iniciar o primeiro e o segundo comando juntos, independente do primeiro ter funcionado ou não.
[ barra vertical ] | vai executar os dois comandos passando o resultado do primeiro como um argumento para o segundo.
Eu sei, isso que eu expliquei soa confuso agora, mas leia novamente essa explicação acima e pratique nos seus scripts... com o tempo a informação vai fazer sentido.
Comentários é outra coisa que podem ajudar no futuro, se você tiver que fazer alguma alteração no seu código. Principalmente se seus scripts são grandes e complexos. Um comentário em bash é antecipado por "#".
#!/bin/bash
# Quem está rodando o script tem acesso a administração?
[[ "${USER}" != "root" ]] && echo "O usuário de id ${USER} não está autorizado a rodar este script, use sudo $0 ou peça ao administrador para executar." && exit 1
# Variáveis de versão
release=$(cat /var/lib/emby/data/lastversion.txt)
myversion=$(awk '/Application/ {print $7}' /var/lib/emby/logs/embyserver.txt)
# Função de atualização
function atualizar(){
wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${release}/emby-server-deb_${release}_amd64.deb
systemctl stop emby-server
dpkg -i emby-server-deb_${release}_amd64.deb
systemctl start emby-server
}
# Atualizar se a versão for diferente
[[ "$myversion" != "${release}" ]] && atualizar || echo "Emby ja esta atualizado"
- O código ficou mais bonitinho, mas é só isso? Qual foi a melhora deste script além da aparência?
- Vamos testar as 4 versões do script para ver quanto tempo demora para executá-los, tem uma ferramenta chamada "time" que diz quanto tempo um programa ou script demora para terminar a execução.
time sudo emby-update
Versão [*****] = 26 segundos
Baixando e instalando toda vez que é chamado.
Versão funcional online = 1.128 segundos
Buscando a informação da versão no site.
Versão funcional offline = 0.040 milésimos de segundo
Buscando a versão no arquivo de texto.
Versão melhorada = 0.019 milésimos de segundos
Última versão mais enxuta.
Eu entendo que esse script parece mais bonito, porém quando você tem um script longo onde a mesma atividade se repete várias vezes e muitos "ifs", ao fazer essa limpeza, além de ficar mais compreensível, vai ficar mais fácil de fazer manutenção e vai executar de forma mais eficiente.
Espero que tenham gostado e aprendido algo novo. Fiquem à vontade para comentar e espalhar esse artigo aos futuros cowboys do teclado.