Qual é a diferença entre && and; quando forking dormir ao fundo?

8

Eu acabei de fazer uma pergunta sobre como forçar um processo para dormir no backgroud.
A notação que eu criei é assim:

sleep 10 && echo "hello world" &

Esta resposta a uma pergunta diferente usa um formato diferente.

( sleep 10 ; echo "hello world" ) &

Eu sei que && apenas permite que o segundo processo seja iniciado se o primeiro retornar verdadeiro. Pode dormir falhar? Existe uma situação em que eu deveria preferir um ao outro?

    
por Baarn 28.11.2013 / 16:10

3 respostas

12

O sono pode falhar se for terminado durante a execução:

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

Como o sono é um executável externo, também é concebível que as chamadas fork ou exec possam falhar, o que também faria com que o bash gerasse um código de erro > 0.

    
por 28.11.2013 / 16:16
5

a; b sempre executa o segundo comando após o primeiro, enquanto a && b executa o segundo comando apenas se o primeiro for bem-sucedido, ou seja, somente se o primeiro comando retornar o status 0.

sleep sempre retorna o status 0, exceto quando é eliminado por um sinal, em cujo caso o status é 128 + número do sinal. (O status também pode ser 126 ou 127 se o comando sleep não existir ou o programa não puder ser iniciado devido à falta de recursos, mas é altamente improvável que você encontre esses casos.)

Assim, você deve usar ; ou && dependendo do que você quer que aconteça se o sono for interrompido:

  • sleep 10; echo hello imprime a mensagem após 10 segundos (menos se sleep for eliminado por um sinal);
  • sleep 10 && echo hello imprime a mensagem após 10 segundos, mas não imprime nada se sleep for eliminado por um sinal.
por 29.11.2013 / 02:11
3

Você deve presumir que qualquer comando pode falhar por vários motivos, mesmo que a suspensão do sono seja realmente improvável.

( sleep 10 ; echo "hello world" ) &

significa dormir em segundo plano e executar o eco após o processo de dormir, mas se o sono falhar, o eco será executado de qualquer maneira ver explicação completa

sleep 10 && echo "hello world" &

significa que você precisa aguardar o final do sono antes de fazer qualquer eco e se o eco falhar, o processo é interrompido, mas o comando inteiro também é armazenado em segundo plano. veja a explicação completa

Conclusão
a primeira sintaxe é shell script, o que significa que ele está considerando instruções separadamente como uma lista.
A segunda opção usa & & significa E assim, se você usá-lo iof o primeiro comando falhar o segundo não será executado.

Este é apenas um comportamento diferente ao lidar com erros.

    
por 28.11.2013 / 16:23