Qual è il vantaggio dello script di shell rispetto ai linguaggi di programmazione interpretati? [chiuso]


15

(Non sono sicuro che sia una domanda appropriata qui)

Gli script Shell, come quelli scritti bash, possono fare molte cose. Possono chiamare i programmi Unix, reindirizzare il loro output, reindirizzare l'I / O da / verso i file, controllare il flusso, controllare se esiste un file, ecc.

Ma un linguaggio di programmazione moderno, ad esempio, pythone rubypuò anche fare queste cose. E sono (credo) più leggibili e mantenibili.

bashgode di un'ampia adozione. Ma molte distribuzioni hanno installato anche pythoninterprete.

Quindi qual è il vantaggio di shell uno script? Se potessi scrivere python, rubyo perl, vale la pena di imparare bash?


3
Se lavori molto con i sistemi Unix, dovresti imparare bash e le altre popolari shell Unix.
Bernard,

Risposte:


30

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 mvcomando in bash
  • Lo script bash può essere eseguito più velocemente - probabilmente lo invocherai da bash e puoi usarlo sourceper 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.


Non puoi fare lo stesso in perl # / usr / bin / perl mv *.png $1(i commenti non mantengono la formattazione) ma con perl puoi anche usare funzionalità linguistiche di livello superiore.
Poma,

19

Anche le risposte esistenti sono valide, ma c'è una ragione che nessuno ha ancora menzionato: perché sarà lì.

Ogni data installazione * nix viene eseguita con alcuni set di pacchetti opzionali che possono essere caricati o meno e non tutti i sistemi avranno Python o Perl o Ruby. Ma se ci si aspetta che il sistema abbia qualche capacità interattiva, avrà una shell. Ciò significa che gli script di shell funzioneranno sui sistemi dai server ai desktop dei programmatori, dai desktop di segreteria thin-client ai dispositivi incorporati, su qualsiasi sistema che supporti un file system scrivibile e una riga di comando bash.

Per qualcuno che lavora sempre e solo in un ambiente server coerente, questo è qualcosa che può essere dato per scontato e non è così importante. Per qualcuno che lavora in un ambiente più vario, questo non dovrebbe essere trascurato.


9

Una parte significativa della tua domanda trova risposta qui:

Perché i linguaggi di scripting (ad esempio Perl, Python, Ruby) non sono adatti come linguaggi di shell?

Ecco un estratto dalla mia risposta a questa domanda :

Ci sono un paio di differenze che mi vengono in mente; solo il flusso di pensieri qui, in nessun ordine particolare:

  1. Python & Co. sono progettati per essere bravi negli script. Bash & Co. sono progettati per essere bravi solo negli script, senza alcun compromesso. IOW: Python è progettato per essere buono sia nello scripting che nel non-scripting, a Bash interessa solo lo scripting.

  2. Bash & Co. non sono tipizzati, Python & Co. sono fortemente tipizzati, il che significa che il numero 123, la stringa 123e il file 123sono abbastanza diversi. Tuttavia, non sono tipizzati staticamente , il che significa che devono avere letterali diversi per quelli, al fine di tenerli separati. Esempio:

    • Ruby: 123(numero), Bash:123
    • Ruby: '123'(stringa), Bash:123
    • Ruby: /123/(regexp), Bash:123
    • Ruby: File.open('123')(file), Bash:123
    • Ruby: IO.open('123')(descrittore di file), Bash:123
    • Ruby: URI.parse('123')(URI), Bash:123
    • Ruby: `123`(comando), Bash:123
  3. Python & Co. sono progettati per scalare fino a 10000, 100000, forse anche 1000000 programmi di linea, Bash & Co. sono progettati per ridimensionare fino a 10 programmi di caratteri .

  4. In Bash & Co., file, directory, descrittori di file, processi sono tutti oggetti di prima classe, in Python, solo gli oggetti Python sono di prima classe, se vuoi manipolare file, directory ecc., Devi avvolgerli in un Prima l'oggetto Python.

  5. La programmazione della shell è sostanzialmente una programmazione del flusso di dati. Nessuno se ne rende conto, nemmeno le persone che scrivono shell, ma si scopre che le shell sono abbastanza brave in questo, e le lingue di uso generale non sono così tante. Nel mondo della programmazione per scopi generici, il flusso di dati sembra essere visto principalmente come un modello di concorrenza, non tanto come un paradigma di programmazione.

Ho la sensazione che il tentativo di affrontare questi punti fissando funzionalità o DSL su un linguaggio di programmazione generico non funzioni. Almeno, devo ancora vederne una convincente attuazione. C'è RuSH (Ruby shell), che tenta di implementare una shell in Ruby, c'è rush, che è un DSL interno per la programmazione di shell in Ruby, c'è Hotwire, che è una shell Python, ma IMO nessuno di questi si avvicina nemmeno a competere con Bash, Zsh, pesce e amici.


Link interrotto: dov'è questa domanda (e la risposta) a cui fai riferimento ora? O tutto ciò che è stato utile è stato copiato qui?
Lupo,

1
@Wolf: Apparentemente, è stato cancellato per essere fuori tema, dopo quasi tre anni. È un peccato.
Jörg W Mittag,

1
Ecco una versione archiviata di questa domanda: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious

1

Direi che uno script di shell ha il vantaggio in situazioni in cui si desidera solo eseguire un'attività automatizzata semplicissima. Ad esempio, se si desidera scrivere uno script che esegua il backup di una directory da un server all'altro ogni giorno alle 5:00, sarebbe eccessivo utilizzare un linguaggio di programmazione pesante.

D'altra parte, se l'attività di programmazione ha più bisogno di strutture di controllo (if / then / else), strutture iterative (loop), I / O di database e file, ecc., Allora è probabilmente più adatto per un più capace linguaggio di programmazione di uno script di shell.

Penso che una buona regola empirica sia:

automatingSimpleTask ? shellScript() : programmingLanguage();

2
Non dovrebbe essere shellScript() if automatingSimpleTask else programmingLanguage() lol.
gahooa,

1
@gahooa haha ​​mostra da che parte del recinto sono su!
CFL_Jeff

1

Mentre è possibile avviare programmi da un programma Python / Ruby / qualunque, nella shell è diverso. Potrebbe essere necessario utilizzare un'API per avviare qualcosa, ad esempio fork (). In uno script di shell, i programmi si comportano più come funzioni in un linguaggio di programmazione convenzionale e possono essere eseguiti, reindirizzati, ecc. Con il minimo sforzo. Il flusso di dati è molto chiaro anche usando le pipe.


0

Se sei completamente libero di scegliere il linguaggio di programmazione che utilizzi per determinate attività, probabilmente potresti quasi completamente evitare di imparare bash e svolgere tutte le attività di programmazione degli script con Perl, Python o Ruby. Questo a volte può portare a una soluzione più dettagliata, specialmente nel caso in cui hai solo bisogno di uno script che chiami una sequenza di altri strumenti Unix, ma in casi più complessi hai ragione, quei moderni linguaggi di script ti danno più possibilità di scrivere un codice meglio gestibile (ti danno anche più possibilità di scrivere codice offuscato, ma questa è la tua scelta).

D'altra parte, spesso non siamo liberi di scegliere la lingua che ci piace di più, perché dobbiamo lavorare con il codice legacy o il codice scritto da uno che conosceva bash ma non conosceva uno dei linguaggi di script che hai nominato.


0

Lo scripting della shell è un linguaggio di programmazione interpretato. Ecco alcuni motivi per cui ho scelto di scrivere script in bash invece di perl o python o qualche altro linguaggio di scripting:

Funziona ovunque : interpreti più complessi potrebbero non essere sempre disponibili, ad esempio durante l'avvio del sistema o su sistemi integrati. Bash è disponibile anche in busybox.

Funziona sulla riga di comando : se sei esperto di shell-scripting, puoi usare quelle abilità per fare cose complesse in script ad hoc direttamente sulla riga di comando. Uso questa abilità ogni giorno come amministratore di sistema.

Scrivere più facilmente programmi che richiamano altri programmi: se ciò che stai cercando di fare è mettere insieme diversi programmi esistenti in modi interessanti, può essere più semplice farlo in uno script di shell che con un linguaggio di livello superiore.

Se il programma è di 30 righe o meno, di solito lo scrivo usando gli script di shell. Se c'è qualche manipolazione complessa o complessa o analisi da affrontare, lo farò usando Python o Perl.


-1

Dovresti dare un'occhiata a coffeescript. Le loro parole:

Sotto tutte quelle parentesi graffe e punti e virgola, JavaScript ha sempre avuto uno splendido modello di oggetti nel suo cuore. CoffeeScript è un tentativo di esporre le parti buone di JavaScript in modo semplice.

La regola d'oro di CoffeeScript è: "È solo JavaScript".

Bene ... ecco la risposta per principianti.

Come principiante ad autoapprendimento negli ultimi 6 mesi, e assaggiando un po 'di C, C ++, Javascript e altri Bashscript negli ultimi giorni ... Posso dirti:

Gli script Shell, come quelli scritti in bash, possono fare molte cose. Possono chiamare i programmi Unix, reindirizzare il loro output, reindirizzare l'I / O da / verso i file, controllare il flusso, controllare se esiste un file, ecc.

e non è semplicemente fantastico! ? loop e variabili? Wow!

pitone e rubino, possono anche fare queste cose. E sono (credo) più leggibili e mantenibili.

Per favore, dimmi dove lo vedi? Ho scritto bashscript in gedit anche in geany e posso formattare (tabs?) E ho letto il mio codice nella velocità della luce usando bashscript in confronto su altre lingue.

Queste lingue hanno altri strumenti per mantenere l'ordine? Conosco oggetti orientati a salvare MOLTO codice, ma ... la gente dice che anche bashscript è OO! WOW 2! Questo è il mio punto qui. Andando a:

il vantaggio di shell uno script

è dentro questa domanda: come fare ciò che questo bashdamnthing può fare in perl o phyton o ruby? È facile?

( bashdamnthing = xdotool )


WTF sta succedendo qui? È una risposta da doge ...
nought101
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.