Qual é a diferença entre ponto-e-vírgula e duplo comercial && [duplicado]

128

Qual é a diferença entre

echo "Hello " ; echo "world"

e

echo "Hello " && echo "world"

Ambos parecem executar os dois comandos um após o outro.

    
por lindhe 27.02.2015 / 08:55

3 respostas

146

echo "Hello " ; echo "world" significa executar echo "world" independentemente do status de saída do comando anterior echo "Hello" , ou seja, echo "world" será executado independentemente de sucesso ou falha do comando echo "Hello" .

Considerando que, no caso de echo "Hello " && echo "world" , echo "world" será executado somente se o primeiro comando ( echo "Hello" ) for um sucesso (ou seja, status de saída 0).

Os comandos a seguir dão um exemplo de como o shell lida com os comandos de encadeamento usando os diferentes operadores:

$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$
    
por 27.02.2015 / 09:00
15

Todo comando no Linux retorna um código de saída quando termina a execução. O código de saída é atribuído a uma variável especial ? , para que você possa verificar facilmente o status do último comando, por exemplo, por echo $? . Isso é frequentemente utilizado em scripts. Se o comando for concluído com êxito, ele retornará um código de saída 0, enquanto, se houver algum erro durante a execução, o status de saída será diferente de zero. Veja o exemplo abaixo:

$ echo "Hello"
Hello
$ echo $?
0

$ rm nonexistent-file
rm: cannot remove ‘nonexistent-file’: No such file or directory
$ echo $?
1

Agora, isso nos leva à sua pergunta. O && é um operador especial que diz "executar o próximo comando apenas se o comando anterior tiver sido bem-sucedido, ou seja, retornado com um código de saída igual a zero". Há também um operador reverso || , que somente executa o seguinte comando se o comando anterior falhou, ou seja, saiu com um valor diferente de zero. Veja o exemplo abaixo:

$ echo "Hello" && echo "Previous command was successful"
Hello
Previous command was successful

$ rm nonexistent-file && echo "This will not be printed"
rm: cannot remove ‘nonexistent-file’: No such file or directory

$ rm nonexistent-file || echo "But this will be shown"
rm: cannot remove ‘nonexistent-file’: No such file or directory
But this will be shown

EDIT: A questão foi sobre a diferença entre && e ; para que esta seja uma resposta completa Eu preciso acrescentar que um ponto e vírgula simplesmente divide um comando do outro. Nenhuma verificação do código de saída ocorre, portanto, se você tiver vários comandos separados por ponto e vírgula, eles serão simplesmente executados sequencialmente, ou seja, um após o outro, completamente independentemente um do outro.

    
por 27.02.2015 / 11:42
7

Além de @ resposta do heemayl , && (e também || ) resultará na shell apenas manipulando um código de saída único para todos os comandos encadeados. Portanto, se você tiver uma linha trap [...] ERR ou set -o errexit , ela processará todos os comandos antes de fazer o tratamento do código de saída.

    
por 27.02.2015 / 10:23

Tags