Os shells possuem recursos especializados para trabalhar com arquivos e obter dados de um programa para outro (assumindo que os dados sejam texto). Para essas tarefas, os scripts de shell podem ser menos pesados do que uma linguagem de script como o Python.
Os scripts de shell também têm a vantagem de que os comandos que você usa são basicamente os mesmos que você usaria na linha de comando - portanto, se você pode fazer algo no shell, está na metade do caminho para criar scripts para a mesma operação.
Aqui, por exemplo, está um script bash que move todos os arquivos PNG do diretório atual para um diretório especificado.
#!/usr/bin/sh
mv *.png $1
Aqui está uma versão do Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Você notará:
- O script bash é um terço do Python, se você contar linhas (excluindo a linha shebang) - ainda menos pela contagem de caracteres
- O script Python requer que três bibliotecas sejam importadas, enquanto tudo o que você precisa para esta tarefa está disponível nativamente no bash
- O script Python requer um loop explícito para mover os arquivos, enquanto isso faz parte da semântica do
mv
comando no bash
- O script bash pode ser executado mais rapidamente - você provavelmente o chamará do bash e poderá usá
source
-lo na mesma instância do shell
glob.iglob("./*.png")
é um bocado só para dizer *.png
Se você quisesse escrever uma operação básica de pipe em Python, ficaria surpreso com a verbosidade. (Obviamente, algumas coisas, como passar porgrep
, podem ser substituídas pelo código Python, em vez de usar um programa externo, portanto, muitas vezes você não precisa canalizar tanto.)
Como um contra-exemplo, uma vez eu tive que escrever uma rotina que verificava quanto tempo cada um dos nomes de arquivos estava em um diretório específico. Se tivessem mais tempo do que o suporte de um sistema operacional específico, teriam que ser reduzidos. Isso poderia resultar em nomes de arquivos duplicados, que eu precisava corrigir, e, como seriam vinculados a partir de uma página da Web, os nomes abreviados precisariam permanecer estáveis, ou seja, deveriam ser gerados de forma que o mesmo nome de arquivo longo sempre resultasse em o mesmo nome de arquivo reduzido. Fiz isso gerando um md5 hexadecimal do nome do arquivo longo e anexando os quatro primeiros caracteres ao nome abreviado (os nomes ainda podem colidir, mas era muito pouco provável, então apenas verifiquei essa condição e paguei a taxa se isso acontecesse) .
Eu fiz isso no bash porque fazia parte do nosso sistema de compilação que já estava escrito no bash. Foi exatamente tão difícil de acertar como você provavelmente está pensando. Levaria muito menos tempo para escrever em Python e provavelmente teria sido mais claro também.
Em resumo: diferentes idiomas são projetados para diferentes tipos de tarefas; escolha o idioma disponível para você que melhor se adequa à tarefa em questão.