Qual è la differenza tra && e; quando biforcuta dormi in background?


8

Ho appena fatto una domanda sul fork di un processo per dormire nel backgroud.
La notazione che mi è venuta in mente è simile a questa:

sleep 10 && echo "hello world" &

Questa risposta a una domanda diversa utilizza un formato diverso.

( sleep 10 ; echo "hello world" ) &

So che &&consente l'avvio del secondo processo solo se il primo ritorna vero. Il sonno può fallire? C'è una situazione in cui dovrei preferire l'una all'altra?


Risposte:


12

La sospensione può non riuscire se viene terminata durante l'esecuzione:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

Poiché sleep è un eseguibile esterno, è anche ipotizzabile che le chiamate fork o exec possano fallire, il che potrebbe anche causare a bash la generazione di un codice di errore> 0.


5

a; besegue sempre il secondo comando dopo il primo, mentre a && besegue il secondo comando solo se il primo ha esito positivo, ovvero solo se il primo comando restituisce lo stato 0.

sleeprestituisce sempre lo stato 0, tranne quando viene ucciso da un segnale, nel qual caso lo stato è 128 + numero del segnale. (Lo stato può anche essere 126 o 127 se il sleepcomando non esiste o il programma non è in grado di avviarsi a causa della mancanza di risorse, ma è molto improbabile che si verifichino questi casi.)

Quindi dovresti usare ;o in &&base a cosa vuoi che accada se il sonno viene interrotto:

  • sleep 10; echo hellostampa il messaggio dopo 10 secondi (meno se sleepviene ucciso da un segnale);
  • sleep 10 && echo hellostampa il messaggio dopo 10 secondi, ma non stampa nulla se sleepviene ucciso da un segnale.

3

Dovresti presumere che qualsiasi comando possa fallire per vari motivi anche se avere un sonno insoddisfacente è davvero molto improbabile.

( sleep 10 ; echo "hello world" ) &

significa sospensione in background ed esecuzione dell'eco dopo il processo di sospensione, ma in caso di errore dell'eco verrà eseguito comunque vedere la spiegazione completa

sleep 10 && echo "hello world" &

significa che è necessario attendere la fine del sonno prima di eseguire l'eco di qualsiasi cosa e se l'eco ha esito negativo il processo si interrompe ma anche l'intero comando viene eseguito in background. vedi spiegazione completa

Conclusione
La prima sintassi è lo script di shell, il che significa che sta considerando le istruzioni separatamente come un elenco.
La seconda opzione usa && significa AND e quindi se la usi nel primo comando fallisce, la seconda non verrà eseguita.

Questo è solo un comportamento diverso nella gestione degli errori.


@terdon Grazie per la modifica, il mio post è stato davvero terribilmente scritto
Kiwy,
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.