Eu quero suprimir erros em meu sub-shell depois de um certo ponto.
Eu escrevi um script para demonstrar a situação:
worked=false
(echo Starting subshell process \
&& echo If this executes process is considered success \
&& false \
&& echo run if possible, but not an error if failed) \
&& worked=true
echo $worked
Quero relatar ao shell externo que o processo funcionou.
Também pensei em colocar a variável trabalhada dentro do subshell:
&& echo This works process worked: \
&& worked=true \
&& false \
&& echo run if possible, but not an error if failed)
Mas isso também não funciona porque definir uma variável dentro do subshell não afeta o script principal.
Que tal agora
O
set -e
encerra o subshell assim que um erro desprotegido é encontrado. A|| true
construção protege uma instrução que pode falhar, onde você não deseja que o subshell termine.Se você quiser apenas saber se o subshell foi bem-sucedido, pode dispensar
$worked
totalmente a variávelObserve que, se você deseja
set -e
interromper a execução no subshell assim que um comando falhar, não poderá usar uma construção como( set -e; ... ) && worked=true
ouif ( set -e; ...); then ... fi
. Isso está documentado na página do manual,bash
mas eu perdi na primeira vez:Você poderia colocar os comandos obrigatórios na condição de um
if
, sem precisar conectar tudo com uma&&
chain:Minha solução foi criar uma variável dentro do subshell e controlar manualmente os códigos de saída com base nisso: