Como outros posts disseram, a resposta curta é
“Sim, commandC
será executado independentemente do que acontecer.”
Como nwildner explorou , a resposta mais longa é:
"Sim, commandC
será executado independentemente do que mais acontecer,
contanto que a casca ainda esteja em uma condição
em que ele pode executar commandC
.
Em outras palavras, o shell não irá além do
commandA && commandB ; command
linha de comando sem executar commandC
. ”
De forma trivial, se commandA
(ou commandB
) for kill -KILL $$
ou qualquer outra coisa que termine ou ameace a concha,
ou interrompe o fluxo de comando, então commandC
não será executado.
(Claramente estamos falando de casos de borda aqui.)
O comportamento é um pouco diferente se set -e
(ou, equivalentemente, set -o errexit
) foi emitido:
- Se
commandA
falhar, commandC
será executado
(mas commandB
não será).
- Se
commandA
for bem-sucedido, então commandB
será executado.
- Se
commandB
for bem-sucedido, então commandC
será executado.
- Se
commandB
falhar, o shell sairá,
e commandC
não será executado.
A opção errexit
especifica que o shell deve sair
se algum comando (qualquer “pipeline”) falhar, com algumas exceções:
The shell does not exit if the command that fails is
part of the command list immediately following a while
or until
keyword,
part of the test following the if
or elif
reserved words,
part of any command executed in a &&
or ||
list
except the command following the final &&
or ||
,
any command in a pipeline but the last,
or if the command's return value is being inverted with !
.
— from bash(1)
Então, se commandA
falhar, isso só fará com que commandB
não seja executado,
porque commandA
é seguido por &&
.
Mas se commandB
for executado e falhar, isso fará com que o shell saia
porque ( commandB
) segue o (final) &&
.