Le shell hanno funzioni specializzate per lavorare con i file e ottenere dati da un programma all'altro (supponendo che i dati siano di testo). Per queste attività, gli script di shell possono essere meno ingombranti di un linguaggio di scripting come Python.
Lo scripting della shell ha anche il vantaggio che i comandi che usi sono sostanzialmente gli stessi comandi che utilizzeresti dalla riga di comando - quindi se puoi fare qualcosa nella shell, sei più che a metà strada per eseguire lo script della stessa operazione.
Ecco ad esempio uno script bash che sposta tutti i file PNG dalla directory corrente a una directory specificata.
#!/usr/bin/sh
mv *.png $1
Ecco una versione di Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Noterai:
- Lo script bash è un terzo della lunghezza di Python se conti le linee (esclusa la linea shebang) - ancor meno per numero di caratteri
- Lo script Python richiede l'importazione di tre librerie, mentre tutto il necessario per questa attività è nativamente disponibile in bash
- Lo script Python richiede un ciclo esplicito per spostare i file, mentre quello fa parte della semantica del
mv
comando in bash
- Lo script bash può essere eseguito più velocemente - probabilmente lo invocherai da bash e puoi usarlo
source
per eseguirlo nella stessa istanza della shell
glob.iglob("./*.png")
è piuttosto un boccone solo per dire *.png
Se volessi scrivere un'operazione pipe di base in Python, rimarrai stupito dalla verbosità. (Certo, alcune cose, come il piping through grep
, possono essere sostituite dal codice Python piuttosto che usare un programma esterno, quindi spesso non è necessario eseguire il pipe abbastanza.)
Come controesempio, una volta ho dovuto scrivere una routine che controllava per quanto tempo ciascuno dei nomi di file era in una directory particolare. Se erano più lunghi di quelli supportati da un determinato sistema operativo, dovevano essere abbreviati. Ciò potrebbe comportare nomi di file duplicati, che dovevo correggere, e dal momento che sarebbero stati collegati da una pagina Web, i nomi abbreviati dovevano essere stabili, cioè dovrebbero essere generati in modo tale che lo stesso nome di file lungo risultasse sempre in lo stesso nome file abbreviato. Ho fatto questo generando un md5 esadecimale del nome file lungo e aggiungendo i primi quattro caratteri di quello al nome abbreviato (i nomi potrebbero ancora scontrarsi, ma era molto improbabile, quindi ho appena controllato per quella condizione e ho salvato su cauzione se dovesse accadere) .
L'ho fatto in bash perché faceva parte del nostro sistema di compilazione che era già scritto in bash. È stato altrettanto difficile ottenere il giusto come probabilmente stai pensando. Ci sarebbe voluto molto meno tempo per scrivere in Python e probabilmente sarebbe stato anche più chiaro.
In breve: lingue diverse sono progettate per diversi tipi di attività; scegli la lingua a tua disposizione più adatta all'attività da svolgere.