Eseguire due comandi in caso di || o &&


11

Ho letto di && e || e vorrei eseguire due comandi nel caso falso.

Ho provato ;ma funziona sempre . Ho provato a metterlo tra parentesi graffe { command1; command2 }ma questo provoca un errore di sintassi.

Voglio fare qualcosa del genere

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

che viene chiuso solo se non esiste una connessione a Internet.


1
Sembra un semplice errore tipografico. Una domanda molto più interessante da porre è la differenza tra ()e {}.
edwinksl,

Risposte:


27

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 xsu 10 ma che l'impostazione è stata dimenticata prima dell'esecuzione del echocomando:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

Con le parentesi graffe, al contrario, x=10viene 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]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.