Quale paradigma usare per determinare lo script della shell rispetto a un linguaggio di programmazione "corretto"?

7

Da un po 'di tempo, ho automatizzato le attività scrivendo script di shell in bash. Questi sono diventati via via sempre più complicati, e ora sto trovando che gli script di bash sono un po 'troppo semplici per quello che voglio - ad esempio, di recente ho scritto un programma a 1000 righe che include multithreading, IPC, un'interfaccia CGI e un set abbastanza complesso di opzioni di configurazione.

Forse la mia impressione è sbagliata, ma ho sempre pensato che lo scripting della shell fosse destinato principalmente a compiti di automazione e configurazione piuttosto piccoli, e non è proprio un linguaggio adatto per scrivere un'applicazione.

La maggior parte delle volte sto facendo cose di basso livello su un singolo server, ad es. avvio / arresto di altri processi, accesso ai socket, monitoraggio dello stato del sistema, quel genere di cose.

Sto cercando di capire meglio cosa posso fare come passo successivo invece di creare un enorme programma di script bash. C'è un paradigma su cui devo riflettere quando cerco di stabilire quando utilizzare gli script di shell rispetto a un linguaggio di programmazione "corretto"?

    
posta Benubird 14.03.2016 - 13:35
fonte

3 risposte

7

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?

    
risposta data 14.03.2016 - 15:23
fonte
2

Penso che tre importanti parametri da considerare siano:

  • riutilizzo del codice.

    Il riutilizzo del codice tra gli script della shell tende a essere difficile (gli script tendono ad essere molto specifici del problema)

  • frequenza di esecuzione del programma.

    Per una singola attività (tipicamente orientata al filesystem) gli script di shell (bash, tcsh ...) sono sufficienti.

    Considera ora cosa succede quando gli altri devono mantenere il codice (o anche tu dopo qualche mese)

  • la complessità delle strutture dati coinvolte.

Un linguaggio come Python è spesso la scelta giusta per progetti / script più grandi (e ha una sintassi molto facile da leggere e capire).

Comunque dai un'occhiata a:

per ulteriori dettagli sui punti di forza specifici di Python vs scripting della shell.

    
risposta data 14.03.2016 - 15:35
fonte
0

Oltre a creare interfacce Web (complesse), lo scripting bash potrebbe essere lo strumento giusto per te dal momento che lo conosci meglio di altri.

È come organizzi i tuoi script in modo da massimizzare il riutilizzo del codice e adattare le modifiche con il minimo sforzo. Dovresti essere in grado di creare complessità per semplicità componendo codici / librerie precedenti. Ed è il modo in cui funziona la programmazione Unix (come tutte le pipe e altre cose).

Penso che bash scripting potrebbe essere sufficiente e appropriato per le tue esigenze.

    
risposta data 14.03.2016 - 15:20
fonte

Leggi altre domande sui tag