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.