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) && .