Sim, há uma grande diferença. &&
é curto-circuito , então o comando subseqüente seria executado somente se o anterior retornasse com um código de saída 0
.
Citações do manual :
expression1
&&
expression2True if both expression1 and expression2 are true.
Por outro lado, um script contendo
expression1
expression2
executaria a segunda expressão mesmo se a primeira falha. (A menos que você tenha especificado o script para sair com erro dizendo set -e
.)
EDIT: Sobre o seu comentário se:
command1; command2
é o mesmo que:
command1
command2
A resposta é geralmente . Bash analisa um bloco inteiro de instrução antes de avaliar qualquer um deles. UMA ; não faz com que o comando anterior seja avaliado. Se o comando anterior tivesse um efeito sobre como o subsequente seria analisado, você notaria a diferença.
Considere um arquivo contendo aliases, vamos chamá-lo de alias
, com uma entrada:
alias f="echo foo"
Agora, considere um script contendo:
shopt -s expand_aliases
source ./alias
f
e outro contendo:
shopt -s expand_aliases; source ./alias; f
então você pode pensar que ambos produziriam o mesmo resultado.
A resposta é NÃO. O primeiro produziria foo
, mas o segundo reportaria:
... f: command not found
Para esclarecer ainda mais, não é expand_aliases
que está causando o problema. O problema é devido ao fato de que uma declaração como:
alias f="echo foo"; f
seria analisado de uma só vez. O shell realmente não sabe o que é f
, isso faz com que o analisador se sufoque.