Punti di forza di Shell Scripting rispetto a Python [chiuso]


94

Ho provato a imparare lo scripting di shell (bash) poche volte ma sono stato scacciato dalla sintassi. Poi ho trovato Python e sono stato in grado di fare la maggior parte delle cose che uno script di shell può fare in Python. Ora non sono sicuro se dovrei più investire il mio tempo nell'apprendimento dello scripting di shell. Quindi voglio chiedere:

Quali sono i punti di forza dello scripting di shell che lo rendono uno strumento indispensabile rispetto a Python?

Non sono un amministratore di sistema di professione, ma sono interessato a configurare sistemi Linux per utenti domestici, quindi penso che l'apprendimento dello scripting di shell possa diventare necessario.

Risposte:


82
  • Lo scripting della shell ha notazioni più semplici per il reindirizzamento I / O.
  • È più semplice creare pipeline da programmi esistenti nella shell.
  • Lo scripting della shell riutilizza interi programmi.
  • Shell è universalmente disponibile (su qualsiasi cosa come Unix) - Python non è necessariamente installato.

È vero che puoi fare tutto in Python che puoi fare in shell; È anche vero che ci sono cose che sono facili in Python che sono difficili in shell (proprio come ci sono cose che sono facili in shell ma difficili in Python). Sapere entrambi sarà la cosa migliore a lungo termine.


16
1 e 2, buoni punti. # 3 è un punto debole, poiché porta a un sacco di overhead che Python può evitare. # 4 potrebbe essere in gran parte falso. Python fa ora parte della maggior parte delle distribuzioni Linux.
S.Lott

1
@Svante: scrivi un semplice ciclo di shell per eseguire una serie di operazioni utilizzando comandi come "test" ed "expr" e confronta i tempi di esecuzione con uno script Python che utilizza il modulo "os". Comandi come test ed expr spesso implicano il fork di un sottoprocesso per fare il vero lavoro.
S.Lott

2
Considero il punto 3 un enorme vantaggio, non uno svantaggio. Ad esempio, considera di ridimensionare una directory piena di immagini con il programma di conversione.
Glenn

7
Notevole anche rispetto a # 4 è che la bashshell in particolare non è universalmente disponibile su tutte le distribuzioni Linux, in particolare quelle per sistemi embedded e altre che eseguono l' busyboxeseguibile. Gli script che prendono di mira la shell Bourne stessa, con la quale bashè retrocompatibile, verranno eseguiti su tutti i sistemi compatibili con POSIX, tuttavia quel linguaggio è molto più limitato di quello implementato da bash.
intuito

5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= quale è) più probabilmente / almeno /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
intuito

54

"Quali sono i punti di forza dello scripting di shell che lo rendono uno strumento indispensabile rispetto a Python?"

Il guscio non è indispensabile. Perché pensi che ce ne siano così tanti? bash, tcsh, csh, sh, ecc., ecc.,

Python è una shell. Non quello che useresti per eseguire tutti i comandi, ma per lo scripting è l'ideale.

Python è una parte più o meno standard di tutte le distribuzioni Linux.

Le conchiglie più tradizionali fanno troppe cose.

  1. Hanno una comoda interfaccia utente per l'esecuzione dei comandi. Ciò include i comandi di una riga in cui la shell cerca il tuo PATH, esegue il fork ed esegue il programma richiesto. Esso comprende anche tubazioni, sequenze e programmi concorrenti (utilizzando ;, |e &) anche alcuni reindirizzamento (usando >e <).

  2. Hanno una scarsa capacità simile a un linguaggio di programmazione per l'esecuzione di script. Questa lingua è piuttosto difficile da usare ed estremamente inefficiente. La maggior parte delle affermazioni in questo linguaggio richiede il fork di uno o più processi aggiuntivi, sprecando tempo e memoria.

Eseguire programmi dalla shell, reindirizzare stderr a un file di registro e questo genere di cose va bene. Fallo nel guscio.

Quasi tutto il resto può essere fatto in modo più efficiente e più chiaro come uno script Python.

Hai bisogno di entrambi . Tuttavia, non dovresti mai scrivere uno script con istruzioni if ​​o cicli in un linguaggio shell tradizionale.


1
@intuited. A) La proliferazione di diversi gusci attesta il numero di caratteristiche che si accumulano nel "guscio"; non è un ruolo essenziale, ma è universale per le funzionalità. B) L'interprete Python è una vera e propria shell Unix, usa # !. C) Un'istruzione di shell "semplice" ifspesso implica l'esecuzione del testprogramma. La shell è un linguaggio di programmazione scadente sotto tutti gli aspetti.
S.Lott

4
@S. Lott: Sembra che ci sia una dissonanza semantica nei circuiti qui. La mia definizione di shell UNIX sarebbe un interprete il cui linguaggio è principalmente orientato al controllo, ad alto livello, del funzionamento di un sistema UNIX. Secondo questa definizione, una shell di qualche tipo è certamente essenziale per il funzionamento di un sistema UNIX e Python non si qualifica. Come definiresti questo termine?
intuito

1
@ S.Lott: Non sono un grande fan della sintassi utilizzata negli script di shell tradizionali, ma la trovo abbastanza utilizzabile e appropriata in molte situazioni in cui l'obiettivo principale è controllare i processi e il flusso del loro output. Questo spesso richiede decisioni e iterazioni. Le shell moderne ( bashalmeno) hanno builtin per gestire il processo decisionale (ad esempio, testè un bashbuiltin, oltre a costrutti più versatili). Sicuramente ha i suoi punti deboli, ma anche i suoi punti di forza. Vale anche la pena impararlo in dettaglio perché ha un paradigma molto diverso rispetto ad altri tipi di lingue.
intuito

1
@intuited: "trovalo abbastanza utilizzabile" è un saluto alla tua bravura, non al linguaggio scadente. Python può essere più utilizzabile da persone meno esperte.
S.Lott

3
@ S.Lott: Interessante, hai una filosofia molto diversa da me. Penso che il design e le operazioni siano fondamentalmente polli e uova. Questo per dire che uno script di shell è un programma che esegue programmi. Molti di questi programmi furono inizialmente implementati come script di shell sempre più complessi. Ad un certo punto è diventato utile, probabilmente tanto per motivi di efficienza quanto per la modularità, che alcuni di essi venissero riscritti in C e, successivamente, Python. Ad esempio: a un certo punto ha cat "$1" | ssh "$2" "cat - >\"$1\""generato scp. Sapevano come progettarlo al meglio perché lo stavano già usando.
intuito

31

La shell rende le azioni comuni e semplici davvero semplici, a scapito di rendere le cose più complesse molto più complesse.

In genere, un piccolo script di shell sarà più breve e più semplice del corrispondente programma python, ma il programma python tenderà ad accettare con garbo le modifiche, mentre lo script di shell tenderà a diventare sempre meno gestibile man mano che viene aggiunto il codice.

Ciò ha come conseguenza che per una produttività quotidiana ottimale è necessario lo scripting della shell, ma è necessario utilizzarlo principalmente per script usa e getta e utilizzare Python ovunque.


14

Non c'è niente che puoi fare con gli script di shell che non puoi fare con Python. Il grande vantaggio degli script di shell è che usi gli stessi comandi che usi quando usi la shell, quindi se sei un utente di shell pesante, lo script di shell a un certo punto diventerà un modo molto rapido e semplice per automatizzare il tuo lavoro di shell .

Trovo anche più facile gestire le pipe di dati negli script della shell che in python, sebbene sia assolutamente fattibile da python.

E, infine, non è necessario attivare un interprete aggiuntivo per eseguire gli script della shell, offrendoti una velocità molto ridotta, ma a volte forse evidente e un vantaggio nell'utilizzo della memoria.

Ma poi di nuovo, gli script Python sono molto più gestibili, sto cercando di migrare da grandi e brutti script di shell agli script Python proprio per questo motivo. È anche più facile eseguire la gestione delle eccezioni e il controllo qualità con Python.


9

non è necessario imparare lo scripting della shell, come indicano tutte le risposte precedenti; ma l'apprendimento non è mai una cosa negativa. è davvero una questione di priorità personali. è molto difficile per qualcun altro dirti cosa vale e cosa non vale il tuo tempo.

la maggior parte dei programmatori trova che l'apprendimento di nuovi linguaggi diventa sempre più facile ogni volta. (lo stesso vale in gran parte anche per le lingue naturali.) e prima inizi, meglio è.

inoltre: l'aver appreso una lingua consente di dissimulare in modo stravagante i suoi limiti da una posizione di completa conoscenza e familiarità. questo probabilmente non ti farà scopare, ma potrebbe farti guadagnare una birra dai tuoi coetanei!


8

Sono d'accordo con la maggior parte delle risposte precedenti. Considero i comandi della shell più adatti per svolgere attività orientate al filesystem (copiare e spostare file, grep, ecc.). Shell è meglio, secondo me, se devi leggere e scrivere su file, poiché un singolo >>file.txtreindirizzamento si aggiunge al file istantaneamente, invece di aver bisogno, diciamo file=open('file.txt','a'); file.write(), ecc.

Attualmente, per mio uso personale, mescolo entrambi, creando uno script python e chiamando os.system ('comando') o os.popen ('comando') ogni volta che un'azione è più semplice in shell che in python.


6

La scocca è disponibile ovunque. Se ti attieni a un insieme relativamente semplice di funzionalità portatili, i tuoi script possono essere eseguiti su telefoni cellulari, router wireless, DVR, netbook, workstation, grandi server di ferro e simili. Python non è necessariamente incluso fuori dalla scatola su molti sistemi e, a seconda dell'ambiente, potrebbe essere difficile installarlo.

Imparare alcuni script di shell può anche aiutarti a imparare alcuni trucchi da riga di comando, poiché la riga di comando è, beh, la shell. È anche utile per prendere una riga di comando abbastanza lunga e complicata e convertirla in uno script più generale dopo aver realizzato che ne avrai bisogno ancora.

La shell ha anche alcune caratteristiche piuttosto potenti; le pipeline sono un costrutto di controllo davvero interessante che è nativo solo per la shell, per quanto ne so.


5

Un'altra cosa da considerare quando si scelgono gli script di shell di Python è la versione di Python che verrà eseguita sulle macchine di destinazione. RHEL5 (per citarne uno) sarà in circolazione per molto tempo. RHEL5 è bloccato con Python 2.4. Ci sono molte belle librerie che dipendono dalle funzionalità aggiunte a Python dopo la 2.4.

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.