Solitamente, le funzioni bash vengono definiti utilizzando parentesi graffe per racchiudere il corpo:funzioni bash: racchiude il corpo in parentesi vs. parentesi
foo()
{
...
}
Quando si lavora su uno script oggi facendo ampio uso di funzioni, I' ci sono problemi con variabili che hanno lo stesso nome nella chiamata come nella funzione chiamante, vale a dire che quelle variabili sono le stesse. Ho quindi scoperto che questo può essere evitato definendo le variabili locali all'interno della funzione come locale: local var=xyz
.
Poi, ad un certo punto, ho scoperto un filo (Defining bash function body using parenthesis instead of braces), in cui si spiega che è altrettanto valida per definire una funzione usando parentesi in questo modo:
foo()
(
...
)
L'effetto di questo è che il corpo della funzione è eseguito in una subshell, che ha il vantaggio che la funzione ha il suo ambito variabile, che mi permette di definirli senza local. Dal momento che avere una portata funzione di locale sembra avere molto più senso e di essere molto più sicuro che tutte le variabili di essere globale, ho subito chiedo:
- Perché le parentesi graffe utilizzate per impostazione predefinita per racchiudere il corpo della funzione, invece di parentesi ?
Tuttavia, ho subito anche scoperto un grave inconveniente per l'esecuzione della funzione in una subshell, specificamente che uscendo lo script dall'interno di una funzione non funziona più, invece mi costringe a lavorare con lo stato di ritorno lungo la intero albero delle chiamate (in caso di funzioni annidate). Questo mi porta a questa domanda di follow-up:
- Ci sono altri aspetti negativi principali (*) per utilizzare le parentesi graffe invece di (che potrebbe spiegare perché bretelle sembrano essere preferito)?
(*) Sono consapevole (dalle discussioni eccezioni legate Ho inciampato su nel corso del tempo), che alcuni sostengono che in modo esplicito utilizzando lo stato di errore è molto meglio che essere in grado di uscire da qualsiasi luogo, ma io preferisco quest'ultimo.
Apparentemente entrambi gli stili hanno i loro vantaggi e svantaggi. Quindi spero che qualcuno di voi utenti bash più esperti mi può dare qualche indicazione generale:
- Quando userò le parentesi graffe per racchiudere il corpo della funzione, e quando è consigliabile passare alla parentesi?
EDIT: Take-away dalle risposte
Grazie per le vostre risposte, la mia testa ora è un po 'più chiaro per quanto riguarda questo. Quindi quello che prendo lontano dalle risposte è:
Stick per le parentesi graffe convenzionali, se non altro per non confondere i potenziali altri utenti/sviluppatori dello script (e anche usare le parentesi graffe se l'intero corpo è avvolto tra parentesi).
L'unico vero svantaggio delle parentesi graffe è che qualsiasi variabile nello scope genitore può essere modificata, anche se in alcune situazioni questo potrebbe essere un vantaggio. Questo può essere facilmente aggirato dichiarando le variabili come
local
.L'utilizzo delle parentesi, d'altra parte, potrebbe avere alcuni effetti indesiderati gravi, come l'incasinamento delle uscite, che porta a problemi con l'uccisione di uno script e l'isolamento dell'ambito della variabile.
La modifica è un ottimo riassunto! – fedorqui