Supressa erros em um subshell?

2

Eu quero suprimir erros na minha sub-casca depois de um certo ponto.

Eu escrevi 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

Eu quero relatar à shell externa que o processo funcionou.

Eu 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 não funciona porque configurar uma variável dentro do subshell não afeta o script principal.

    
por Philip Kirkbride 13.12.2017 / 22:54

4 respostas

5

Que tal isso

worked=false
(
    set -e
    echo Starting subshell process
    echo If this executes process is considered success
    false
    echo run if possible, but not an error if failed || true
)
[[ 0 -eq $? ]] && worked=true

echo "$worked"

O set -e finaliza a sub-shell assim que um erro desprotegido é encontrado. A construção || true protege uma instrução que pode falhar, onde você não quer que a subshell termine.

Se você quer apenas saber se a subshell foi bem sucedida, você pode dispensar totalmente a variável $worked

(
    set -e
    ...
)
if [[ 0 -eq $? ]]
then
    echo "Success"
fi

Observe que, se você quiser usar set -e para interromper a execução no subshell assim que um comando falhar, não será possível usar uma construção como ( set -e; ... ) && worked=true ou if ( set -e; ...); then ... fi . Isso está documentado na página man de bash , mas eu perdi a primeira vez:

If a compound command or shell function sets -e while executing in a context where -e is ignored, that setting will not have any effect until the compound command or the command containing the function call completes.

    
por 13.12.2017 / 23:09
1
worked=false
(status=1;
    echo Starting subshell process \
    && echo If this executes process is considered success \
    && status=0
    && false \
    && echo run if possible, but not an error if failed;
    exit $status) \
  && worked=true

echo $worked
    
por 13.12.2017 / 23:20
1

Você pode colocar os comandos obrigatórios na condição de if , não é necessário conectar tudo com uma && chain:

worked=false
(   if echo Starting subshell process &&
       echo If this executes process is considered success ; then
        false &&
        echo run if possible, but not an error if failed
        exit 0
    fi
    exit 1 ) && worked=true

echo worked=$worked
    
por 13.12.2017 / 23:16
0

Minha solução foi criar uma variável dentro da subshell e controlar manualmente os códigos de saída com base nisso:

worked=false
(echo Starting subshell process \
    && echo If this executes process is considered success \
    && check=true \
    && false \
    && echo run if possible, but not an error if failed
  if [[ -n "$check" ]]; then exit 0; else exit 1; fi) \
  && worked=true

echo $worked
    
por 13.12.2017 / 23:12

Tags