Qual é a diferença entre && e; quando bifurcar o sono em segundo plano?


8

Acabei de fazer uma pergunta sobre a bifurcação de 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 &&só permite que o segundo processo seja iniciado se o primeiro retornar verdadeiro. O sono pode falhar? Existe uma situação em que devo preferir um ao outro?


Respostas:


12

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

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

Como o sleep é um executável externo, também é possí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.


5

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

sleepsempre retorna o status 0, exceto quando é morto por um sinal; nesse caso, o status é 128 + número do sinal. (O status também pode ser 126 ou 127 se o sleepcomando não existir ou o programa não puder iniciar devido à falta de recursos, mas é improvável que você encontre esses casos.)

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

  • sleep 10; echo helloimprime a mensagem após 10 segundos (menos se sleepfor morto por um sinal);
  • sleep 10 && echo helloimprime a mensagem após 10 segundos, mas nada imprime se sleepfor morto por um sinal.

3

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

( sleep 10 ; echo "hello world" ) &

significa suspensão de segundo plano e executar eco após o processo de suspensão, mas se a suspensão falhar, o eco será executado mesmo assim, veja a explicação completa

sleep 10 && echo "hello world" &

significa que você precisa aguardar o final do sono antes de repetir qualquer coisa e, se o eco falhar, o processo será interrompido, mas todo o comando também ficará em segundo plano. ver explicação completa

Conclusão A
primeira sintaxe é o shell script, o que significa que está considerando instruções separadamente como uma lista.
A segunda opção usa && significa AND, portanto, se você a usar no primeiro comando falhar, o segundo não será executado.

Esse é apenas um comportamento diferente ao lidar com erros.


Graças @terdon para a edição, Meu post foi na verdade terrivelmente escrita
kiwy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.