L'uso di parens inserisce i comandi in una subshell che non è sempre ciò che si desidera. In alternativa, utilizzare le parentesi graffe:
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
Il trucco qui è che, a differenza delle parentesi, il comando finale tra parentesi graffe deve essere seguito da ;
.
Perché è richiesto un punto e virgola o una nuova riga
Una parentesi graffa è un argomento valido per un comando. Ad esempio, ecco una parentesi graffa come argomento per echo
:
$ echo }
}
Di conseguenza, se la shell vede:
{ command1; command2 }
La shell interpreta command1 come privo di argomenti e command2 come un argomento costituito dal carattere }
. Una parentesi graffa }
viene interpretata come chiusura di un raggruppamento se segue un punto e virgola o una nuova riga. Per far funzionare quanto sopra:
{ command1; command2; }
Sottotitoli e la differenza tra {...}
e(...)
Si noti che quanto segue è impostato x
su 10 ma che l'impostazione è stata dimenticata prima dell'esecuzione del echo
comando:
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
Con le parentesi graffe, al contrario, x=10
viene ricordata l'impostazione di :
$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
La differenza è perché le assegnazioni di variabili in una subshell non sopravvivono dopo il completamento della subshell.
Documentazione
Da man bash
:
(elenco)
l'elenco viene eseguito in un ambiente subshell (vedere AMBIENTE DI ESECUZIONE DEI COMANDI di seguito). Le assegnazioni di variabili e i comandi integrati che influiscono sull'ambiente della shell non rimangono attivi dopo il completamento del comando. Lo stato di ritorno è lo stato di uscita dell'elenco.
{ elenco; }
l'elenco viene semplicemente eseguito nell'attuale ambiente shell. l'elenco deve essere terminato con una nuova riga o punto e virgola. Questo è noto come comando di gruppo. Lo stato di ritorno è lo stato di uscita dell'elenco. Notare che, diversamente dai metacaratteri (e), {e} sono parole riservate e devono apparire quando una parola riservata può essere riconosciuta. Dal momento che non causano un'interruzione di parola, devono essere separati dall'elenco da spazi bianchi o da un altro metacarattere della shell.
[Enfasi aggiunta]
()
e{}
.