Gli script di shell sono utili per una sequenza di comandi di shell. Mentre Bash ha un paio di funzionalità avanzate, tutto ciò che va oltre il passare le stringhe ai comandi è molto doloroso. In particolare, questi sono segni che il tuo programma ha superato uno script di shell:
- hai un flusso di controllo complesso, ad es. loop, ricorsione o parallelismo che va oltre le pipe ecc ..
- hai bisogno di strutture dati complesse. Mentre Bash fornisce array, altre shell non richiedono e richiedono invece l'uso di file flat. L'utilizzo di raccolte di dati è in ogni caso difficile.
- devi convalidare gli input per il tuo programma. Gli script di shell sono difficili da scrivere correttamente con diversi meccanismi di espansione, di escape e di suddivisione in parole. Un linguaggio appropriato può esserci d'aiuto, magari offrendo un sistema di tipi.
- vuoi la modularizzazione perché hai molte funzioni di supporto.
- più codice viene speso per la logica piuttosto che per invocare comandi.
- hai requisiti prestazionali che rendono irragionevole creare un nuovo processo per ogni piccola operazione.
I linguaggi di scripting (ad esempio Perl / Python / Ruby) offrono varie funzionalità che rendono la programmazione molto più constrongvole, ad es. sintassi e semantica più stringenti (variabili con scope!), strutture dati complesse, librerie per attività comuni, funzionalità di modularizzazione, .... Il loro vantaggio rispetto ad altri linguaggi di programmazione è che non è necessario impostare una toolchain di compilazione che consenta un'esperienza di sviluppo simile come lo sviluppo di script di shell. Tuttavia, invocare strumenti esterni diventa più difficile. Quello che era un semplice caso di set -e; tool foo --bar="$baz"
in uno script di shell doveva essere scritto in Perl come 0 == system 'tool', 'foo', "--bar=$baz" or die "Couldn't invoke tool: $!"
o open my $result, '-|', 'tool', 'foo', "--bar=$baz" or die "Couldn't invoke tool: $!"
, a seconda di ciò che stavi cercando di fare (esistono anche problemi simili per Python e Ruby, ovviamente ). Ciò rende le cose difficili possibili, ma le cose semplici sono meno semplici. C'è un punto in cui ne vale davvero la pena, ma non tutti gli script di shell sono a quel punto solo perché sono grandi o complicati.
Se lo script della shell contiene solo determinate parti che potrebbero trarre vantaggio da un linguaggio di programmazione migliore, sarebbe anche possibile riscriverle solo in un'altra lingua e quindi richiamarle come programmi esterni. Tuttavia, questo funzionerà solo se il flusso di dati principale è abbastanza semplice. È anche possibile il contrario: avere un programma invoca uno script di shell per una parte che consiste semplicemente nel richiamo di altri programmi. Tali programmi costituiti da più file eseguibili possono essere abbastanza ragionevoli, ma presentano anche alcuni problemi: il mio percorso relativo è impostato correttamente? Come posso eseguire il debug di questi programmi interattivi? Come posso strutturare i miei dati in modo che tutte le parti possano gestirli facilmente?