Qual é o motivo para usar && em vez de; colocar comandos na mesma linha?

30

Não sendo especialista no Linux e no Unix, estou me perguntando qual a diferença entre esses 2 métodos de amarrar 2 comandos na mesma linha? Não vejo diferença na saída neste exemplo simplista

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Isso não causou problemas - só estou curioso ..

pfeiffep
fonte

Respostas:

43

&&é um 'e' lógico. O primeiro argumento é avaliado e o segundo é avaliado apenas se o primeiro retornar verdadeiro. O motivo é que "false AND something" é sempre falso, portanto, não é necessário avaliar o segundo argumento nesse caso.

Portanto, usando &&você, verifique se o segundo comando não será executado se o primeiro relatar um erro ( trueé representado pelo código de saída 0, o que indica que não houve erro). Por outro lado, ;executa os dois comandos, independentemente do resultado do primeiro.

Conclusão: Encadear comandos com &&é um bom hábito. Em contraste, ;ele não executará comandos subseqüentes se algo der errado.

azimute
fonte
você quer dizer que isso 0significa trueou que 0significa verdade - há um erro?
22713 Michael Butler
1
@MichaelButler: 0significa true. Eu adicionei um esclarecimento.
21713 azimut
26

;

Executa sequencialmente os comandos, independentemente do status de saída anterior:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

AND lógico

Execute o próximo comando, mas apenas se o comando anterior tiver sido bem-sucedido (o status de saída foi 0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

||

OR lógico

Execute o próximo comando, mas apenas se o comando anterior falhar (o status de saída não foi 0):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command
phoibos
fonte
6
Além disso, sh -c "exit 0"pode ser substituído por truenesses exemplos e sh -c "exit 1"por false.
Flimm