Alternative di scripting agli script della shell Bash


16

Sono appena migrato su una workstation UNIX. La mia memoria degli script della shell Bash è svanita dalla scuola e trovo che la sintassi sia molto confusa. Mi chiedo quali altri linguaggi di scripting vengano utilizzati per automatizzare le attività. I due più popolari di cui ho sentito parlare sono Perl e Python.

  1. Quale linguaggio di scripting è maggiormente utilizzato dai negozi del mondo reale?
  2. Quale linguaggio di scripting ricorda più da vicino la sintassi C / C ++?
  3. Esiste un altro linguaggio di scripting di cui non sono a conoscenza?

Grazie per l'aiuto,

Scott


2
Questo dovrebbe probabilmente essere un wiki della comunità.
EBGreen

2
Attualmente uso PHP per la maggior parte delle attività di sistema. Metterò insieme una risposta adeguata con questo presto. Ha molte librerie integrate, il che è utile.
Kyle Hodgson,

Le lingue destinate a Shell fanno qualcosa che altre lingue potrebbero non fare; Che è gestire e tenere sotto controllo tutti i processi figlio ricorsivamente mai generati. Il blog pubblicitario Phusion Passenger spiega in dettaglio perché: phusion.github.io/baseimage-docker In breve, i tuoi script scritti in lang-x probabilmente non gestiscono correttamente le routine di spegnimento. Il che è perfettamente ok fintanto che li esegui come figli di un vero processo di shell. Disclaimer, non sono un esperto. Questa informazione è solo al meglio della mia comprensione che può essere difettosa.
ThorSummoner,

Risposte:


12

In una certa misura è una questione di preferenza personale. Perl e Python sono sicuramente lassù in termini di popolarità.

Per rispondere a due delle tue tre domande, però:

  1. Immagino che bash sia il più ampiamente usato, probabilmente seguito da perl. Solo indovinando, non so se qualcuno ha fatto un sondaggio. :)
  2. Ci sono milioni di linguaggi di scripting là fuori. :)

La mia raccomandazione è Python però. È facile da leggere e scrivere, immensamente potente, e sul Web ci sono tonnellate di risorse utili per l'apprendimento, per non parlare del codice che è possibile copiare e riutilizzare.


1
Sono d'accordo con questo. Trovo che Python sia facile da imparare e in grado di fare tutto ciò che lancio, dato che è stato in un buon vecchio OS / 2 giorni con REXX.
slovacco

3
+1 per Python ... la potenza di C in un linguaggio di scripting. Puoi rendere i tuoi script semplici o complessi come vuoi;)
KFro

1
su sistemi non NT il modulo python shrende accessibile l'uso di python come linguaggio di scripting della shell; Tuttavia, se vi imbattete in casi limite (come il multiprocessing), dovrete imparare il modulo di sottoprocesso che trovo ad oggi troppo difficile da usare.
ThorSummoner,

5

Perl e Python sono ovviamente le risposte; ma ognuno di essi viene utilizzato per completare diverse attività:

  1. Bash - Giù le mani il più facile da imparare. Con gli script Bash esegui comandi e manipoli l'output.
  2. Python - Secondo più facile da imparare. Python è molto più utile di Bash poiché puoi usare Python per scrivere programmi completi ed è ben supportato dalla community. Python è anche estremamente leggibile e facile da modificare mesi dopo.
  3. Perl - Il migliore dei tre (per lo scripting), ma facilmente la curva di apprendimento più ripida. Ha un ottimo supporto per le espressioni regolari (che è la ragione principale per cui è ancora in uso oggi) e probabilmente colpirai molti script Perl nel tempo. I problemi principali con Perl sono la leggibilità del codice: mesi dopo aver scritto il codice non sarai in grado di capire cosa fa. Quindi faresti meglio a commentare pesantemente.
  4. Awk / Sed - Entrambi molto utili, ma entrambi molto difficili da imparare. Suggerirei di affrontare questi ultimi, a meno che tu non sia bravo negli schemi.

Per quanto riguarda quale imparare adesso (poiché presumibilmente non ne conosci nessuno), imparerei Python. È il più semplice e utile da sapere.

E per quanto riguarda le risposte alle tue domande:

Quale linguaggio di scripting è maggiormente utilizzato dai negozi del mondo reale?

Tutti, ma immagino che Perl abbia un piccolo vantaggio qui (essendo che è stato in uso nell'amministrazione del sistema per molto più tempo).

Quale linguaggio di scripting ricorda più da vicino la sintassi C / C ++?

Perl

Esiste un altro linguaggio di scripting di cui non sono a conoscenza?

Ruby, Tcsh / Csh, http://en.wikipedia.org/wiki/Interpreted_language


2
Se passi del tempo in perl, puoi scrivere perl perfettamente leggibile. Le persone che scrivono il codice spaghetti sono troppo veloci per incolpare Perl per i loro fallimenti.
Cian,

1
Sto parlando solo basandomi sulle esperienze di amministratore di sistema; Ho dovuto mantenere il codice che altre persone hanno scritto che è stato quasi impossibile da leggere. Di solito finisco per riscrivere il codice in Python.
Michael Pobega,

3

awk per piccoli lavori, python per più di oneliners.

Python (se non usi API specifiche e altre cose dipendenti dalla piattaforma) ha una ricca "libreria standard" che è disponibile su tutte le piattaforme in cui ottieni la versione di Python in uso. Questo è molto bello in quanto puoi riutilizzare facilmente i tuoi script e significa che la tua conoscenza è un buon investimento anche se cambi piattaforma.

Nella nostra azienda utilizziamo Python per tutti gli script, il monitoraggio, ... e Java per l'applicazione, e siamo benestanti in un ambiente eterogeneo.


1

Direi che perl e python sono probabilmente le due migliori alternative. Puoi fare molto anche con sed e awk.


1

Sh (bourne shell), grep, awk e sed è sempre una buona cosa per rimettersi alle prese. Perl è eccellente se non si desidera molto regexing del testo e la manutenibilità non è così importante (non dire che non è possibile). Pitone; se la leggibilità è importante per te. La mia preferenza è Python ma tutti questi strumenti sono buoni per la maggior parte delle cose che ci dai. Potresti voler riconsiderare il tuo requisito di sintassi c / c ++, rimanere bloccato su di esso non ti aiuterà a lungo termine.


Grazie Martin. Ho notato (dai campioni sul web) che Perl ha una notevole somiglianza con PHP (anche se sono sicuro che fosse Perl prima di PHP, storicamente). È una dichiarazione equa?
Scott Davies,

PHP 1.0 era uno script perl, quindi non è una coincidenza :)
Bill Weiss,

1

Se stai cercando di imparare qualcosa da zero, probabilmente è meglio (ri) imparare bash.

Oltre a ciò, perl e python sono popolari in questi giorni; Sono parziale in perl, ma il mio stile di scripting perl non è cambiato molto da quando Perl 4 è uscito.

Non sono a conoscenza di alcun linguaggio di scripting "simil-c-sintassi".


1

Perl, senza dubbio, anche solo per l'incredibile risorsa di CPAN ( http://search.cpan.org/ ). Il vantaggio dell'uso di un linguaggio di scripting con una comunità così ampia è che è improbabile che tu abbia mai bisogno di inventare qualcosa da solo.

Perl ha anche il vantaggio di essere complessa quanto è necessario per la situazione attuale. Puoi trattarlo come un semplice linguaggio di scripting per una rapida amministrazione o script a singolo scopo, ma puoi usare concetti orientati agli oggetti o sistemi di meta oggetti estesi quando vuoi creare applicazioni più grandi e facili da mantenere (come demoni, server, client).

Le differenze tra i linguaggi di scripting da soli non sono abbastanza gravi per scegliere un chiaro vincitore, ma dovresti principalmente guardare a quanto sarà facile trovare informazioni sugli argomenti che ti interessano.

La sintassi del Perl può anche essere sorprendentemente vicina a C, purché tu possa aggirare la mancanza di digitazione e dei sigilli; l'uso avanzato del perl verrebbe naturalmente man mano che imparerai i punti di forza della lingua.

E per i negligenti sul fronte della leggibilità: puoi scrivere codice difficile da leggere in qualsiasi lingua. Se guardi indietro al tuo codice di 4 mesi fa e non riesci a capirlo, stai facendo qualcosa di sbagliato.

ps Questo post è stato riempito con collegamenti a vari moduli di amministrazione su CPAN, ma apparentemente i nuovi utenti possono pubblicare un solo link, quindi usa quel link CPAN per cercare cose come 'CVS' 'SVN' 'Cron' e 'Moose' (un vasto sistema di oggetti)


1
  • Rubino
  • Pitone
  • Go - un linguaggio multipiattaforma, lo scripting è menzionato come uno dei punti di forza di Go .
  • Node.js - vedi Grunt.js, Gulp.js. Molti progetti ora utilizzano Node.js come strumento di automazione della shell.
  • Perl

1

[per consigli di scripting generali, vedere le altre risposte]

Questa risposta riguarda l'uso dei programmi da riga di comando e anche di loro grandi catene.

Per eseguire catene di programmi CLI, e forse molte catene in sequenza, bash è il più semplice. Perl può fare lo stesso, ma la lingua è molto più difficile da imparare ed è molto più complessa, e come molti hanno sottolineato, è facile scrivere Perl intelligibile.

Se stai iterando su file e parametri, bash è più semplice iniziare b / c, puoi prototipare nella shell, quindi copiarlo in uno script e aggiungere alcuni array e loop con un sovraccarico minimo.

Esempi di cosa intendo:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

In bash, è facile avvolgerlo in alcuni loop su alcuni di questi parametri. Tuttavia , il codice diventa difficile da leggere quando lo script è più di alcune decine di righe. --- immagina 30 serie di comandi (poche righe ciascuna) per trenta diversi grafici di dati ---

Perl e Python potrebbero essere migliori per script di grandi dimensioni perché hanno una sintassi più pulita per cicli e variabili, ma i comandi bash devono essere generati come stringhe, eseguiti come sottoprocessi e stdin, stdout acquisito. Può essere fatto, ma non può sostituire completamente l'ambiente shell nativo.

Se le shell avessero un linguaggio migliore, tutto ciò sarebbe evitato.


0
  1. più usato: Perl, principalmente per motivi storici. Python è ampiamente disponibile in tutte le distribuzioni Linux e BSD (è persino installato su Mac OSX) ed è molto più bello da imparare / programmare. Naturalmente, una volta ottenuta la sintassi, Bash è più semplice per quasi tutto ciò che si potrebbe fare dalla riga di comando. Dopotutto, è la riga di comando.

    • Sintassi C: c'è csh , ma puoi facilmente installare TCC e usare la vera C come linguaggio di script, compilata dal sorgente in meno tempo rispetto all'avvio di altre lingue.

    • altri linguaggi di scripting: tanti! Lua , Ruby , JavaScript ...


0

Dovresti usare una combinazione di tutti quelli dove è appropriato. Non mi piace molto il perl (leggibilità), ma è buono per molte cose. Python invece era qualcosa di nuovo per me in termini di amministrazione del sistema, fino a quando non ho dovuto gestire (e devo ancora) alcune macchine KVM. L'avvio, l'arresto, il salvataggio, il caricamento, la migrazione di tutte quelle macchine tramite script sono diventati realtà dopo 1 ora di pasticciare con i collegamenti python di libvirt.

Ultimo ma non meno importante non userei perl o python se dovessi, diciamo, scaricare tutti i database da un server mysql ogni notte (ogni database nel suo file di dump), tararli e sincronizzarli su un altro server. Perché ? Perché è più veloce e più facile scriverlo in bash :)

Alla fine, dovresti usare qualsiasi linguaggio si adatti meglio al tuo compito attuale e non usare solo un determinato linguaggio di scripting solo perché ti piace di più.


0

Mi piace il rubino. È semplice e facile da programmare. C'è un libro eccellente sull'amministrazione del sistema che usa ruby .

Ruby viene utilizzato in diversi sistemi di gestione della configurazione (capistrano, chef, burattino) e nell'ultima versione di metasploit.

Puoi usare rush , un sostituto della shell Unix con sintassi ruby ​​e fare cose del genere:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

Grazie amico. Non avevo idea che potresti usare Ruby per l'amministratore di sistema - ho sempre pensato che fosse incentrato sul web. Sto cercando qualcosa in uso nella maggior parte delle organizzazioni. È giusto dire che Ruby per l'amministratore di sistema è ancora troppo sanguinante?
Scott Davies,

1
Shell / Perl sono le uniche due lingue che puoi trovare installate in modo affidabile ovunque. Python è probabilmente il prossimo più comune, con ruby ​​che corre un quarto molto distante (in realtà, probabilmente quinto, dietro awk).
Cian,

@ScottDavies PHP e ASP.net sono le uniche lingue web-centric che conosco; anche Javascript progettato per essere eseguito esclusivamente sul Web è maturato in passato come un elemento negativo per la convalida dei moduli. Tuttavia puoi inviare HTML con qualsiasi lingua, anche apparentemente bash .
ThorSummoner,

0

Esempio di rubriche a una riga:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

Userei il rubino.

Confronta con sh, è moderno e potente.

Confronta con Python, è coerenza, un'edizione, un gestore di pacchetti. E non mi piace la sintassi del rientro.

Confronta con Perl, un po 'di vecchia scuola e la sintassi è troppo complessa per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.