Le conchiglie hanno caratteristiche specializzate per lavorare con i file e ottenere dati da un programma a un altro (supponendo che i dati siano testo). Per queste attività, gli script di shell possono essere meno ingombranti di un linguaggio di scripting come Python.
Anche lo scripting di shell ha il vantaggio che i comandi che usi sono praticamente gli stessi comandi che useresti dalla riga di comando - quindi se puoi fare qualcosa nella shell, sei più che a metà strada nello script della stessa operazione .
Qui, ad esempio, c'è uno script bash che sposta tutti i file PNG dalla directory corrente in 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 del Python se contate le linee (esclusa la linea shebang) - ancor meno per il numero di caratteri
- Lo script Python richiede l'importazione di tre librerie, mentre tutto ciò che è necessario per questa attività è disponibile nativamente in bash
- Lo script Python richiede un ciclo esplicito per spostare i file, mentre quello è parte della semantica del comando
mv
in bash
- Lo script di bash può essere eseguito più rapidamente: probabilmente lo invocerai da bash e puoi utilizzare
source
per eseguirlo nella stessa istanza della shell
-
glob.iglob("./*.png")
è un bel boccone solo per dire *.png
Se volessi scrivere un'operazione di pipe di base in Python, verrai sbalordito dalla verbosità. (Certo, alcune cose, come il piping attraverso grep
, possono essere sostituite dal codice Python piuttosto che usare un programma esterno, quindi spesso non è necessario eseguire il pipe altrettanto.)
Come controesempio, una volta dovevo scrivere una routine che verificava per quanto tempo ciascuno dei nomi di file si trovava in una particolare directory. Se erano più lunghi di quelli supportati da un particolare sistema operativo, dovevano essere abbreviati. Ciò potrebbe causare nomi di file duplicati, che dovevo correggere, e dato 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 file lungo avrebbe sempre come risultato lo stesso nome di file abbreviato. L'ho fatto generando un hex md5 del nome file lungo e aggiungendo i primi quattro caratteri al nome abbreviato (i nomi potrebbero ancora scontrarsi, ma è stato molto impreciso, quindi ho controllato la condizione e salvato se dovesse accadere) . Doveva anche registrare l'operazione di ridenominazione, in modo da poter eseguire in seguito una ricerca e sostituzione in lotti sui file per correggere i collegamenti tra di essi (ho scritto un file di comandi sed e l'ho passato a sed per ogni file).
L'ho fatto in bash perché faceva parte del nostro sistema di build che era già stato scritto in bash. Era esattamente difficile da ottenere, come probabilmente stai pensando. Ci sarebbe voluto molto meno tempo per scrivere in Python e probabilmente sarebbe stato anche più chiaro.
In breve: diverse lingue sono progettate per diversi tipi di compiti; scegli la lingua a tua disposizione più adatta all'attività da svolgere.