Il mio consiglio:
bash
(e simili) non sono linguaggi di programmazione generici. Mentre è possibile realizzare alcuni script sofisticati bash
non è il modo migliore per imparare la programmazione in generale. È il modo più naturale per eseguire attività di amministrazione dei sistemi che ruotano principalmente attorno all'esecuzione di altri programmi, alla gestione dei loro file e directory di dati e al marshalling di input e output da e verso di essi. Se bash
è un martello, riservalo per problemi che sembrano davvero unghie. Imparare a fare qualcosa di non banale bash
sarà considerevolmente più semplice se imparerai alcuni sottoinsiemi molto piccoli di sed
e awk
(poiché la manipolazione delle stringhe in bash
è in gran parte ispirata dalla sintassi di operazioni simili in questi "piccoli" linguaggi).
- Per la programmazione generale sotto Linux ascolterai molti argomenti appassionati. I due migliori contendenti sono Perl e Python . Questi sono entrambi linguaggi di scripting di livello molto alto che sono di uso generale, che espongono una funzionalità di basso livello sufficiente per eseguire quasi tutte le operazioni accessibili a qualsiasi processo di spazio utente sul sistema e con enormi raccolte di moduli e librerie pre-scritte disponibili.
Io vi consiglio di leggere un testo introduttivo sul C e trascorrere del tempo in esecuzione il strace
e ltrace
comandi su alcuni semplici comandi di utilità come ls
e mkdir
e /bin/echo
così via (in realtà in questi giorni io suggerirei ltrace -S
al posto di strace
, ma incursioni nel output di entrambi i comandi e in l' ltrace
output come aumentato -S
dall'opzione sarà estremamente educativo).
C è il linguaggio di programmazione principale in cui sono scritti il kernel Linux e la libc GNU. (Le piccole parti sono in assemblaggio). Quasi tutti i programmi su un sistema Linux (o altro tipo UNIX) sono collegati alle librerie C (libc). Anche gli interpreti Perl e Python primari (e la maggior parte degli altri linguaggi di scripting) sono scritti in C. Questi programmi (il kernel, le librerie di sistema comuni e i vari interpreti del linguaggio di scripting) sono tutti scritti da programmatori C poiché il loro design e le caratteristiche sono fortemente influenzati dalle loro implementazioni sottostanti. Quindi una comprensione più profonda di uno qualsiasi di questi implica la comprensione di C. Non è necessario conoscere nulla di C ++ o Java per comprendere la programmazione a questo livello. (Ciascuno di essi può essere interessante e necessario a sé stante a seconda della patch di carriera,
Quindi, se sei d'accordo con le mie premesse finora, lo abbiamo ridotto a una scelta tra Perl e Python.
Ecco dove iniziano le vere guerre di fiamma.
Il mio consiglio è di concentrarsi prima su Python (2.x). Python ha una sintassi relativamente semplice e coerente. Puoi imparare le basi della sintassi di Python in poche ore e questa è la stragrande maggioranza della sintassi che incontrerai mai. Ci sono solo alcune caratteristiche (comprensione dell'elenco, espressioni del generatore, decoratori) che sono rughe della sintassi di base. Quindi la maggior parte dei tuoi sforzi nell'apprendimento di Python sarà dedicata all'apprendimento delle ampie librerie standard e alla ricerca del modo "migliore" per usarle (e capire quali sono le serie specifiche di eccezioni che vale la pena gestire per rendere i tuoi programmi robusti) e, soprattutto, nell'apprendimento dei concetti sottostanti.
Penso che le ampie librerie di Python e la sintassi relativamente semplice presentino due distinti svantaggi.
In primo luogo, mentre impari come fare a un livello molto alto in Python potresti trovare noioso il pensiero di dover lavorare a un livello inferiore. Dove lavoro Perl è lo standard. Ho prototipato il mio lavoro in Python, dove so che posso farlo funzionare in modo molto più rapido e affidabile rispetto a Perl; poi temo di dover passare e portarlo in Perl per i miei colleghi. (Ero abbastanza bravo in Perl anni prima di usare Python --- quindi non è una questione di semplice familiarità).
L'altro svantaggio è che a volte è difficile trovare il modo più alto livello per eseguire un determinato compito in Python. Ad esempio per recuperare una pagina Web potresti inizialmente provare a farlo con socket di basso livello ... che funzionerà. Tuttavia, dovresti duplicare un bel po 'di codice che puoi già trovare, incluso nei moduli urllib
e / o urllib2
. Il fatto stesso che le librerie standard, a partire dalla 2.7.1, includano entrambe queste affermazioni, sottolinea. Ove possibile, i manutentori di Python hanno esteso moduli e API precedenti in modo trasparente; tuttavia ci sono dozzine di casi in cui Python conserva due o tre moduli in cui l'estensione trasparente non è stata possibile per qualche motivo. (Per un altro esempio si potrebbe guardare le opzioni per il parsing opzioni della riga di comando: argparse
, optparse
, egetopt
. C'è poco danno nello scrivere i tuoi programmi usando getopt
(il più vecchio di questi). Per utility molto semplici con poche opzioni e una rigida convenzione di chiamata (utilizzata solo da un piccolo gruppo di persone, ad esempio), non c'è nulla di intrinsecamente sbagliato nel camminare su di sys.argv
te. Tuttavia, di solito vale la pena leggere attentamente i documenti e seguire i collegamenti in fondo ai moduli di livello precedente o inferiore che descrivono le funzionalità di livello più recente o superiore disponibili.
Il mio consiglio si basa sulla mia opinione che si desidera concentrarsi su concetti più profondi e non dover dedicare gran parte del proprio tempo e sforzo a questioni sintattiche e specifiche della lingua. Capire quando usare un sottoprocesso, rispetto a un thread o le funzionalità multi-elaborazione incluse in Python ha relativamente poco a che fare con il linguaggio e tutto ciò che riguarda la competenza di programmazione indipendentemente dal linguaggio. (Nel punto in cui puoi capire gli argomenti sul modello guidato dagli eventi di Twisted rispetto al threading e al multiprocessing, allora avrai probabilmente imparato Python e sarai pronto per programmare in qualsiasi lingua).
L'argomento contrario, per Perl, è semplice e pratico. Ci sono molti altri lavori là fuori che richiederanno, in particolare, competenze con Perl. Perl è un linguaggio potente e ha librerie estremamente estese. (Il nucleo di Perl distribuito con la maggior parte dei sistemi Linux copre una gamma più piccola di funzionalità rispetto alle librerie Python standard; si presume che tu abbia installato un numero significativo di pacchetti aggiuntivi dalla tua distribuzione o tramite CPAN --- l'archivio completo Perl Rete). (Al contrario, ci sono meno moduli e pacchetti Python che devo recuperare separatamente ... quelli sono disponibili da PyPI --- l'indice dei pacchetti Python).
Quindi, se impari il Perl, avrai un vantaggio per trovare lavoro, in particolare lavori di amministratore di sistema, a breve termine. Tuttavia, la sintassi di Perl è ... beh ... nelle parole di alcuni dei suoi stessi appassionati ... "patologicamente eclettico!" Perl può essere estremamente conciso e il suo codice è pieno di punteggiatura. Coloro che lo adorano discuteranno all'infinito che è "facile" e ha perfettamente senso --- e avranno infinite opportunità di farlo in forum pieni di confusione su come è stato interpretato un determinato frammento di codice. La sintassi e la lingua utilizzate nella documentazione e da coloro che la supportano nei forum pubblici sono sfumate al punto da poter dedicare considerevoli sforzi per apprenderle.
Ora, ti preghiamo di realizzare che questo precedente commento è soggettivo e parziale. È possibile che proverai Perl e scoprirai che la sintassi è intuitiva e piacevole. Se è così, più potere per te. Tuttavia, personalmente trovo che la mia comprensione delle idiosincrasie di Perl decade molto rapidamente. I fondamenti che mantengo, ma trovo che sia una lotta ogni volta che devo tornare ad esso per più di poche righe di codice.
Ci sono molte altre lingue che studieresti, Java, Lisp e Scheme, TCL, Scala e così via. Tuttavia, suggerirei di iniziare con uno che offre il miglior equilibrio tra utilità e semplicità.