Los shells tienen características especializadas para trabajar con archivos y obtener datos de un programa a otro (suponiendo que los datos sean texto). Para esas tareas, los scripts de shell pueden ser menos engorrosos que un lenguaje de scripts como Python.
El scripting de Shell también tiene la ventaja de que los comandos que usa son básicamente los mismos comandos que usaría desde la línea de comandos, por lo que si puede hacer algo en el shell, está a medio camino de scripting la misma operación.
Aquí, por ejemplo, hay un script bash que mueve todos los archivos PNG del directorio actual a un directorio específico.
#!/usr/bin/sh
mv *.png $1
Aquí hay una versión de Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Notarás:
- El script bash es un tercio del Python si cuenta líneas (excluyendo la línea shebang), incluso menos por recuento de caracteres
- El script Python requiere la importación de tres bibliotecas, mientras que todo lo que necesita para esta tarea está disponible de forma nativa en bash
- El script Python requiere un bucle explícito para mover los archivos, mientras que eso es parte de la semántica del
mv
comando en bash
- El script bash puede ejecutarse más rápido: probablemente lo invocará desde bash, y puede usarlo
source
para ejecutarlo en la misma instancia del shell
glob.iglob("./*.png")
es un bocado solo para decir *.png
Si quisieras escribir una operación básica de tubería en Python, te sorprendería la verbosidad. (Por supuesto, algunas cosas, como canalizar grep
, se pueden reemplazar por código Python en lugar de usar un programa externo, por lo que a menudo no es necesario canalizar tanto).
Como contraejemplo, una vez tuve que escribir una rutina que verificara cuánto tiempo cada uno de los nombres de archivo estaba en un directorio particular. Si eran más largos que los admitidos por un sistema operativo particular, tenían que acortarse. Esto podría dar como resultado nombres de archivo duplicados, que necesitaba rectificar, y dado que estarían vinculados desde una página web, los nombres abreviados debían ser estables, es decir, deberían generarse de tal manera que el mismo nombre de archivo largo siempre resultara en el mismo nombre de archivo acortado. Hice esto generando un hexadecimal md5 del nombre de archivo largo y agregando los primeros cuatro caracteres de ese nombre acortado (los nombres aún podrían colisionar, pero era muy incierto, así que simplemente verifiqué esa condición y rescaté si ocurriera) .
Hice esto en bash porque era parte de nuestro sistema de compilación que ya estaba escrito en bash. Fue exactamente tan difícil acertar como probablemente esté pensando. Hubiera tomado mucho menos tiempo escribir en Python y probablemente también hubiera sido más claro.
En resumen: diferentes idiomas están diseñados para diferentes tipos de tareas; elija el idioma disponible para usted que mejor se adapte a la tarea en cuestión.