domingo, 12 de julho de 2015

Scripts - Diferenças entre Bash e Python

No artigo anterior discutimos sobre a utilidade dos Scripts para o usuário do Sistema Operacional e vimos que em Linux os usuários preferem estes escritos em Bash ou Python. Vamos falar agora sobre a usabilidade na construção de Scripts escritos nessas linguagem.

Começando por sua criação, para o Linux, um dos melhores editores que conheço é chamado Kate que possui um terminal embutido, veja uma imagem dele abaixo. Já a sua localização pode variar de usuário para usuário, pessoalmente gosto de mantê-los organizados embaixo de uma única pasta.


Para criar um Script, criamos um arquivo texto comum, na primeira linha colocamos o comando que indica ao sistema qual linguagem estamos utilizando e fornecemos a permissão para o arquivo ser um executável, com o comando:
$ chmod +x [nomearquivo]
Lembre-se que, por padrão, scripts Python possuem a extensão do arquivo .py enquanto que em Bash usamos .sh, recomendo que utilizemos esta forma de modo a identificar mais facilmente os arquivos.

Não existe a menor diferença entre o que podemos conseguir com Bash ou Python, o que existe é facilidade de escrita. Por exemplo, o script a seguir dispara dois comandos para obtermos algumas informações do sistema sobre dois comandos que são muito mais úteis com seus parâmetros:
  • uname: fornece o nome do seu sistema, porém com o parâmetro -a fica mais completo.
  • df: fornece o espaço livre e ocupado de cada partição, porém com o parâmetro -h essa informação fica, visualmente falando, melhor.
O script criado em Bash para executar esses comandos, com os respectivos parâmetros, teria a seguinte codificação:
#!/bin/bash
printf "Sobre seu sistema:\n"
uname -a
df -h
Já a mesma funcionalidade se fosse escrita em Python, seria assim:
#!/usr/bin/env python
import subprocess
print "Sobre seu sistema:"
subprocess.call(["uname", "-a"])
subprocess.call(["df", "-h"])
Ou seja, notamos que neste caso Bash seria muito mais simples e fácil de entender. Mas então basta apenas usar Bash e pronto? Nem sempre, vamos comparar dois Scripts que buscam uma determinada palavra em um arquivo qualquer, para o nosso exemplo crie um arquivo chamado "arquivo.txt" com o seguinte conteúdo:
Trecho esta em 1
Aqui em dois nao tem
Em tres tem Trecho
Em quatro nao
E tem trecho em cinco, mas minusculo
Está sublinhado a palavra "Trecho" apenas para observarmos melhor onde ocorre, e em negrito a palavra iniciada com a letra em minúscula. Em Bash o script seria escrito assim:
#!/bin/bash
ARQUIVO="arquivo.txt"
TRECHO="Trecho"
TOTAL=(`tr " " "\n" < $ARQUIVO | grep $TRECHO|wc -w`)
echo "A palavra '$TRECHO' ocorre $TOTAL vezes no arquivo $ARQUIVO."
Já em Python ficaria assim:
#!/usr/bin/env python
arquivo = "arquivo.txt"
trecho = "Trecho"
total = 0
try:
    fileObject = open(arquivo)
    for lin in fileObject:
        total += lin.count(trecho)
except:
    print "Arquivo " + arquivo + " inexistente."
    sys.exit(1)
finally:
    fileObject.close()
print "A palavra '" + trecho + "' ocorre " + str(total) + " no arquivo " + arquivo + "."
Algumas observações sobre o Script em Bash, primeiro que as variáveis não obrigatoriamente devem estar em letras maiúsculas, porém o sinal de igual deve estar colado (sem uso de espaço). Segundo é que o comando colocado em TOTAL usa dois "macetes" o primeiro é que o sinal "`" não é aspas simples, mas o caractere que normalmente usamos para conseguir a crase. E finalmente o comando é uma agregação dos comandos "tr", "grep" e "wc" para conseguirmos a totalização das ocorrências.

Já em Python, apesar de muito maior acredito que seja de auto entendimento (obviamente partindo do princípio que conhece a linguagem), ou seja, no caso de uma manutenção seria muito mais simples em Python do que em Bash. Scripts devem ser usados para serem de fácil entendimento, não adianta escrevermos 3 ou 4 linhas e na hora que precisamos modificar algo ficarmos completamente perdido.

Se duvida, tente modificar ambos os scripts para localizar a palavra pouco importando letras maiúsculas ou minúsculas, veja qual dará mais trabalho.

Obrigado e até a próxima
Fernando Anselmo

Um comentário: