</syntaxhighlight>
*Lo crearescript applicativi di non grandidograndi dimensioni e con un breve ciclo di sviluppo ▼
Lo script dovrebbe consentire a un utente di salvare il file in corso di modifica, mettere in pausa l'editor, eseguirlo attraverso il comando <code>. / build</code> per creare il programma aggiornato, testarlo, e poi tornare all'editor. Dal 1980, comunque, gli script di questo tipo sono stati sostituiti con i programmi di utilità come [[make]], che sono specializzati per programmi di "costruzione". Quando digitiamo un comando (che chiameremo job per distinguerlo dai processi) e premiamo il tasto "invio", questi viene eseguito ma, come abbiamo pilotato l'input e l'output, possiamo controllarne anche l'esecuzione. Alcuni comandi sono complessi e se avviati, impedirebbero l'uso della shell fino al loro completamento. È possibile quindi avviare il comando in [[Esecuzione in background|background]] ed avere nuovamente la shell libera per altri utilizzi; si può richiamare il comando in foreground oppure sospenderlo o annullarlo. Per eseguire il comando in background è sufficiente inserire alla fine dello stesso il carattere “&”. Se volessimo stampare il file prova.txt in background basterebbe dare il comando [[lpr]] prova.txt &. Il sistema operativo assegna un numero univoco al job e lo avvia contrassegnandolo con un segno “+” (job attivo).
* cr
Nel caso avviassimo un nuovo comando, a quest'ultimo verrebbe assegnato il numero successivo e marcato con il segno “-” (in attesa di esecuzione). Per vedere quali e quanti jobs sono in esecuzione, basterà dare il comando jobs ottenendo il relativo output. È possibile quindi permettere al comando di tornare in foreground utilizzando il comando fg seguito dal carattere “%” e dal numero del job. Se per esempio si volesse portare in foreground il secondo comando in coda, si digiterà fg %2. Il comando non potrà tornare in background fino alla sua conclusione. È possibile comunque aggirare questa limitazione sospendendo il job con la combinazione di tasti “CTRL Z” e riavviandolo tramite fg o bg. Un comando terminato non avviserà l'utente della conclusione del proprio lavoro se non esplicitamente indicato tramite notify %1 (in questo caso avvisa della terminazione del primo comando). È possibile infine procedere alla terminazione forzata del comando nel caso, ad esempio, entri in un ciclo infinito. Linux mette a disposizione il comando kill seguito dal numero che identifica il job (es. %1).
===Generalizzazione===
Processi batch semplici non sono insoliti per le attività isolate, ma l'uso di cicli di shell, test, e delle variabili offre molta più flessibilità agli utenti. Una [[bash]] (shell Bourne-Again script) converte le immagini [[JPEG]] in [[Portable Network Graphics|PNG]], fornendo i nomi di immagine sulla riga di comando - eventualmente attraverso caratteri jolly - invece di essere elencati all'interno dello script, dove è possibile creare questo file, in genere salvato come <code>/home /''nomeutente''/bin/jpg2png</code>
<syntaxhighlight lang="bash">
#!/bin/bash
for jpg in "$@" ; do # use $jpg in place of each filename given, in turn
png="${jpg%.jpg}.png" # find the PNG version of the filename by replacing .jpg with .png
echo converting "$jpg" ... # output status info to the user running the script
if convert "$jpg" jpg.to.png ; then # use the convert program (common in Linux) to create the PNG in a temp file
mv jpg.to.png "$png" # if it worked, rename the temporary PNG image to the correct name
else # ...otherwise complain and exit from the script
echo 'error: failed output saved in "jpg.to.png".' 1>&2
exit 1
fi # the end of the "if" test construct
done # the end of the "for" loop
echo all conversions successful # tell the user the good news
</syntaxhighlight>
Il jpg2png comando può quindi essere eseguito su una intera directory piena di immagini JPEG con appena <code>jpg2png *.jpg</code>
===Verisimilitudine===
Una caratteristica fondamentale di script di shell è che l'invocazione dei loro interpreti è gestita come una caratteristica del sistema operativo di base. Così la shell d'utente piuttosto di essere solo in grado di eseguire script in linguaggio shell, o uno script avendo solamente la direttiva d'interprete gestita correttamente se è stato eseguito da una shell, (entrambi dei quali sono stati limitazioni nei primi anni di gestione della shell Bourne-Again script), la script di shell è inizializzata ed eseguita dal sistema operativo stesso. Uno script di shell moderno non può essere posto sullo stesso piano dei comandi di sistema, ma molti comandi di sistema sono in realtà degli script di shell (o più in generale, degli script, dato che alcuni di essi non sono interpretati da una shell, ma invece da linguaggi di scripting quali: [[Perl]], [[Python]], o altri linguaggi). Ciò vale anche per i codici di uscita ritorno come altre utilità di sistema per indicare il successo o il fallimento, permettendo così di identificarli come componenti di grandi programmi indipendentemente da come questi strumenti più grandi sono implementati.
Come i comandi standard del sistema, gli script di shell classicamente omettono qualsiasi tipo di estensione del file a meno che non siano destinati ad essere letti in una shell in esecuzione attraverso un meccanismo speciale dedita a questo scopo (ad esempio: <code>sh</code>'s ".", or <code>csh</code>'s <code>source</code>).
===Programmazione===
Molte shell moderne forniscono anche varie funzioni normalmente disponibili solo nell'uso di [[linguaggi di programmazione]] generale più sofisticati, come il controllo del flusso di costrutti, le variabili, i commenti, le matrici, [[subroutine]], e così via. Con questo tipo di funzioni disponibili, è possibile scrivere applicazioni ragionevolmente sofisticate come script di shell. Tuttavia, sono ancora limitati dal fatto che la maggior parte dei linguaggi di shell hanno poco o nessun sostegno per la tipizzazione dei dati dei sistemi, le classi, filettatura, matematica complessa, e di altre funzionalità complete del linguaggio comune, e sono generalmente più lento rispetto al codice compilato o linguaggi interpretati scritti con la velocità come un obiettivo di performance.
==Altri linguaggi di programmazione==
Molti potenti linguaggi di scripting sono stati introdotti per compiti che sono troppo grandi o complessi per essere comodamente gestiti con gli script di shell ordinaria, ma per i quali i vantaggi di uno script sono auspicabili e il vero sovraccarico dello sviluppo, compilando il linguaggio di programmazione sarà svantaggioso. Le specifiche di ciò che separa i linguaggi di scripting dai linguaggi di programmazione ad alto livello è frequente fonte di dibattito. Ma in generale un linguaggio di scripting è quella che richiede un interprete
Potrebbe sembrare di essere di fronte a un'affermazione speculativa, in quanto spesso vi sono tante ragioni citate: "Tuttavia, il centro script di manutenzione del sistema, il quale in alternativa potrebbe essere scritto in un linguaggio, continua ad essere scritto come script della shell, in quanto non è sempre possibile contare sulla presenza del pertinenti motori linguaggio di scripting.
Con un linguaggio di scripting si può:
* incollare tra loro codici preesistenti
* processare files di testo molto grandi
* manipolare files e directory
* usufruire di operatori specializzati di alto livello
▲* creare applicativi di non grandi dimensioni e con un breve ciclo di sviluppo
* creare applicativi con una GUI integrata
* avere portabilità su piattaforme Unix, Windows e Macintosh
* avere un codice interpretato (assenza di compilazione/linking)
Esempi di linguaggi di scripting:
* [[Bash]]
* [[AppleScript]]
* [[Batch]] (Linguaggio di scripting usato da MS-DOS)
* [[ActionScript]]
* [[JavaScript]] (Linguaggio di scripting, utilizzabile da [[C++]])
* [[Lua]] (Linguaggio di scripting, utilizzabile da [[C++]])
* [[Perl]]
* [[Python]] (Linguaggio di scripting, utilizzabile da [[C++]])
* [[PHP]] (Linguaggio di scripting, utilizzabile da [[C++]])
* [[VBScript]]
* [[Tcl]] (Linguaggio di scripting, utilizzabile da [[C++]])
==Ciclo di vita==
Gli script di shell spesso servono come fase iniziale nello sviluppo di software, e sono spesso oggetto di conversione in seguito a una diversa implementazione sottostante, più comunemente convertita in [[Perl]], [[Python]], o [[C (linguaggio)|C]]. La direttiva d'interprete permette alla dettagliata implementazione di essere completamente nascosta all'interno dello script, invece di essere esposta come un'estensione del file, e prevede reimplementazione senza soluzione di continuità in diverse lingue, senza alcun impatto sugli utenti finali.
==Voci correlate==
* [[Linguaggio di programmazione]]
* [[Linguaggio di scripting]]
* [[Shell (informatica)]]
* [[Windows PowerShell]]
* [[Windows Script Host]]
* [[Crontab]]
==Altri progetti==
{{Interprogetto|wikibooks=Ad Hoc Data Analysis From The Unix Command Line}}
==Collegamenti esterni==
* {{cita web|http://www.faqs.org/docs/air/tsshell.html|''An Introduction To Shell Programming'' by Greg Goebel}}
* {{cita web|http://steve-parker.org/sh/sh.shtml|''UNIX / Linux shell scripting tutorial'' by Steve Parker}}
* {{cita web|https://developer.apple.com/mac/library/documentation/OpenSource/Conceptual/ShellScripting/|''Shell Scripting Primer'' (Apple)}}
* {{cita web | 1 = https://www.linux.com/articles/34658 | 2 = ''What to watch out for when writing portable shell scripts'' by Peter Seebach | accesso = 4 maggio 2019 | urlarchivio = https://web.archive.org/web/20090324070111/http://www.linux.com/articles/34658 | dataarchivio = 24 marzo 2009 | urlmorto = sì }}
* {{cita web|http://freebookcentre.net/UnixCategory/Free-Unix-Shell-Programming-Books-Download.html|Free Unix Shell scripting books}}
* {{cita web|http://www.worldlingo.com/ma/enwiki/it/Scsh|Scsh}}
* {{cita web|http://www.caspur.it/~lanucara/lanucara_files/scripting.pdf|Linguaggi di scripting}}
{{Portale|informatica}}
[[Categoria:Concetti di programmazione]]
|