Les shells ont des fonctionnalités spécialisées pour travailler avec des fichiers et obtenir des données d'un programme dans un autre (en supposant que les données sont du texte). Pour ces tâches, les scripts shell peuvent être moins lourds qu'un langage de script comme Python.
Les scripts shell ont également l'avantage que les commandes que vous utilisez sont fondamentalement les mêmes commandes que vous utiliseriez à partir de la ligne de commande - donc si vous pouvez faire quelque chose dans le shell, vous êtes à plus de la moitié du script de la même opération.
Voici par exemple un script bash qui déplace tous les fichiers PNG du répertoire courant vers un répertoire spécifié.
#!/usr/bin/sh
mv *.png $1
Voici une version Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Vous remarquerez:
- Le script bash est un troisième aussi longtemps que le Python si vous comptez les lignes (à l'exclusion de la ligne shebang) - encore moins par nombre de caractères
- Le script Python nécessite l'importation de trois bibliothèques, tandis que tout ce dont vous avez besoin pour cette tâche est nativement disponible dans bash
- Le script Python nécessite une boucle explicite pour déplacer les fichiers, alors que cela fait partie de la sémantique de la
mv
commande dans bash
- Le script bash peut s'exécuter plus rapidement - vous l'invoquerez probablement à partir de bash, et vous pouvez l'utiliser
source
pour l'exécuter dans la même instance du shell
glob.iglob("./*.png")
est une bouchée juste pour dire *.png
Si vous vouliez écrire une opération de pipe de base en Python, vous seriez étonné de la verbosité. (Bien sûr, certaines choses, comme le piping grep
, peuvent être remplacées par du code Python plutôt que d'utiliser un programme externe, de sorte que vous n'avez souvent pas besoin de canaliser tout autant.)
Comme contre-exemple, j'ai dû écrire une routine qui vérifiait combien de temps chacun des noms de fichiers se trouvait dans un répertoire particulier. S'ils étaient plus longs que ceux pris en charge par un système d'exploitation particulier, ils devaient être raccourcis. Cela pourrait entraîner des noms de fichiers en double, que je devais rectifier, et comme ils seraient liés à partir d'une page Web, les noms raccourcis devaient être stables, c'est-à-dire qu'ils devraient être générés de telle manière que le même nom de fichier long aboutirait toujours à le même nom de fichier raccourci. J'ai fait cela en générant un hexadécimal md5 du nom de fichier long et en ajoutant les quatre premiers caractères de celui-ci au nom abrégé (les noms pouvaient encore entrer en collision, mais c'était très unilatéral, donc j'ai juste vérifié cette condition et j'ai renoncé si cela devait arriver) .
Je l'ai fait en bash car cela faisait partie de notre système de construction qui était déjà écrit en bash. Il était exactement aussi difficile de réussir que vous ne le pensez probablement. Il aurait fallu beaucoup moins de temps pour écrire en Python et aurait probablement été plus clair aussi.
En bref: différentes langues sont conçues pour différents types de tâches; choisissez la langue qui vous convient le mieux pour la tâche à accomplir.