Funzioni della shell

()

3.3 Funzioni della shell

Le funzioni della shell sono un modo per raggruppare i comandi per l’esecuzione successiva utilizzando un unico nome per il gruppo. Vengono eseguiti proprio come un comando “normale”. Quando il nome di una funzione di shell viene utilizzato come semplice nome di comando, viene eseguito l’elenco dei comandi associati a quel nome di funzione. Le funzioni della shell vengono eseguite nel contesto della shell corrente; non viene creato alcun nuovo processo per interpretarli.

Le funzioni sono dichiarate usando questa sintassi:

fname () comando-composto [ reindirizzamenti ]

o

funzione fname [()] comando-composto [ reindirizzamenti ]

Questo definisce una funzione di shell denominata fname . La parola riservata functionè facoltativa. Se functionviene fornita la parola riservata, le parentesi sono facoltative. Il corpo della funzione è il comando composto comando-composto (vedi Comandi composti ). 

Quel comando è solitamente un elenco racchiuso tra { e }, ma può essere qualsiasi comando composto sopra elencato, con un’eccezione: se functionviene utilizzata la parola riservata, ma le parentesi non vengono fornite, le parentesi graffe sono obbligatorie. compound-command viene eseguito ogni volta che fname viene specificato come nome di un comando. Quando la shell è in modalità POSIX (vediBash POSIX Mode ), fname deve essere un nome di shell valido e potrebbe non essere lo stesso di uno degli speciali incorporati (vedi Special Builtins ). 

Nella modalità predefinita, il nome di una funzione può essere qualsiasi parola della shell senza virgolette che non contiene ‘$‘. Eventuali reindirizzamenti (vedi Reindirizzamenti ) associati alla funzione di shell vengono eseguiti quando la funzione viene eseguita. Una definizione di funzione può essere cancellata utilizzando il-Fopzione per il unsetbuiltin (vedi Bourne Shell Builtins ).

Lo stato di uscita di una definizione di funzione è zero a meno che non si verifichi un errore di sintassi o esista già una funzione di sola lettura con lo stesso nome. Quando viene eseguita, lo stato di uscita di una funzione è lo stato di uscita dell’ultimo comando eseguito nel corpo.

Si noti che per ragioni storiche, nell’uso più comune le parentesi graffe che circondano il corpo della funzione devono essere separate dal corpo da blanks o nuove righe. 

Questo perché le parentesi sono parole riservate e vengono riconosciute come tali solo quando sono separate dall’elenco dei comandi da spazi bianchi o da un altro metacarattere della shell. Inoltre, quando si utilizzano le parentesi graffe, l’ elenco deve essere terminato da un punto e virgola, un ‘&‘, o una nuova riga.

Quando una funzione viene eseguita, gli argomenti della funzione diventano i parametri posizionali durante la sua esecuzione (vedere Parametri posizionali ). Il parametro speciale ‘#‘ che si espande al numero di parametri posizionali viene aggiornato per riflettere la modifica. Il parametro speciale 0è invariato. Il primo elemento della FUNCNAMEvariabile è impostato sul nome della funzione durante l’esecuzione della funzione.

Tutti gli altri aspetti dell’ambiente di esecuzione della shell sono identici tra una funzione e il suo chiamante con queste eccezioni: le trap DEBUGe non vengono ereditate a meno che alla funzione non sia stato assegnato l’ attributo usando il builtin o l’ opzione sia stata abilitata con il builtin, (in cui case tutte le funzioni ereditano le e trap) e la trap non viene ereditata a meno che l’ opzione shell non sia stata abilitata. Vedere Bourne Shell Builtins , per la descrizione del builtin. 

RETURN

tracedeclare-o functraceset

DEBUGRETURNER

R-o errtracetrap

La FUNCNEST

variabile, se impostata su un valore numerico maggiore di 0, definisce un livello massimo di annidamento della funzione. Le chiamate di funzione che superano il limite provocano l’interruzione dell’intero comando.

Se il comando return integrato viene eseguito in una funzione, la funzione viene completata e l’esecuzione riprende con il comando successivo alla chiamata della funzione. Qualsiasi comando associato al RETURNtrap viene eseguito prima della ripresa dell’esecuzione. Al termine di una funzione, i valori dei parametri posizionali e del parametro speciale ‘#‘ vengono ripristinati i valori che avevano prima dell’esecuzione della funzione. Se viene fornito un argomento numerico a return, quello è lo stato di ritorno della funzione; in caso contrario lo stato di ritorno della funzione è lo stato di uscita dell’ultimo comando eseguito prima del return.

Le variabili locali alla funzione possono essere dichiarate con il localbuiltin. Queste variabili sono visibili solo alla funzione e ai comandi che essa richiama. Ciò è particolarmente importante quando una funzione di shell chiama altre funzioni.

Variabili locali Variabili “ombra” con lo stesso nome dichiarato negli ambiti precedenti. Ad esempio, una variabile locale dichiarata in una funzione nasconde una variabile globale con lo stesso nome: i riferimenti e le assegnazioni si riferiscono alla variabile locale, lasciando invariata la variabile globale. Quando la funzione ritorna, la variabile globale è nuovamente visibile.

La shell utilizza l’ ambito dinamico per controllare la visibilità di una variabile all’interno delle funzioni. Con l’ambito dinamico, le variabili visibili e i relativi valori sono il risultato della sequenza di chiamate di funzione che ha causato l’esecuzione per raggiungere la funzione corrente. Il valore di una variabile che una funzione vede dipende dal suo valore all’interno del suo chiamante, se presente, dal fatto che quel chiamante sia l’ambito “globale” o un’altra funzione della shell. Questo è anche il valore che una dichiarazione di variabile locale “ombreggia” e il valore che viene ripristinato quando la funzione restituisce.

Ad esempio, se una variabile var viene dichiarata come locale nella funzione func1 e func1 chiama un’altra funzione func2 , i riferimenti a var fatti da func2 verranno risolti nella variabile locale var da func1 , oscurando qualsiasi variabile globale denominata var .

Lo script seguente mostra questo comportamento. Quando viene eseguito, viene visualizzato lo script

In func2, var = func1 local
funzione1()
{
    locale var='func1 locale'
    funzione2
}

funzione2()
{
    echo "In func2, var = $var"
}

var=globale
funzione1

Il unsetbuilt-in agisce anche usando lo stesso ambito dinamico: se una variabile è locale per l’ambito corrente, unsetla disattiverà; in caso contrario, l’annullamento si riferirà alla variabile trovata in qualsiasi ambito di chiamata come descritto sopra. Se una variabile nell’ambito locale corrente non è impostata, rimarrà tale fino a quando non verrà reimpostata in quell’ambito o fino a quando la funzione non viene restituita. Una volta restituita la funzione, qualsiasi istanza della variabile in un ambito precedente diventerà visibile. Se unset agisce su una variabile in un ambito precedente, qualsiasi istanza di una variabile con quel nome che era stata ombreggiata diventerà visibile.

I nomi e le definizioni delle funzioni possono essere elencati con il -Fopzione al comando incorporato declaretypeset) (vedi Bash Builtins ). Il-Fopzione per declaretypeset elencherà solo i nomi delle funzioni (e facoltativamente il file di origine e il numero di riga, se l’ extdebug opzione shell è abilitata). Le funzioni possono essere esportate in modo che le subshell le abbiano automaticamente definite con -Fopzione per il exportbuiltin (vedi Bourne Shell Builtins ).

Le funzioni possono essere ricorsive. La FUNCNESTvariabile può essere utilizzata per limitare la profondità dello stack di chiamate di funzione e limitare il numero di chiamate di funzione. Per impostazione predefinita, non viene posto alcun limite al numero di chiamate ricorsive.

/ 5
Grazie per aver votato!

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?