Comandos compostos em && / || condição

3

Eu sei que essa é uma pergunta comum e eu já vi respostas antes, mas não consigo me lembrar do que elas eram nem encontrá-las.

#!/usr/bin/env bash

set -m         # allow for job control
EXIT_CODE=0    # exit code of overall script

function foo() {     
     for job in 'jobs -p'; do
         echo "PID => ${job}"
         wait ${job} ||  { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }
     done
}

trap 'foo' CHLD

Minha pergunta é sobre essa linha:

wait ${job} ||  { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }

Se wait ${job} gerar um código de saída diferente de zero, eu gostaria de repetir a declaração e fazer uma atribuição (atribuindo 1 a EXIT_CODE ).

Eu não acredito que minha sintaxe esteja correta. Eu não estou recebendo nenhum erro óbvio, mas tenho certeza que não está correto porque a declaração não está sendo repetida. Mas ainda estou saindo com um código de saída de 1.

    
por Alexander Mills 13.02.2017 / 12:20

1 resposta

2

Tem certeza de que wait está terminando com um status de saída diferente de zero? Considere, por exemplo:

false || { echo "At least ..."; EXIT_CODE=1; }

Isso gerará a mensagem e definirá EXIT_CODE apropriadamente.

Inicialmente, pensei que era isso que você procurava:

wait ${job} || ( echo "At least ..."; EXIT_CODE=1 )

O problema com esta abordagem é que o conteúdo de (...) é executado em um subshell - a mudança para o valor de EXIT_CODE será local para essa subshell (ou seja, não será visível quando você tentar leia depois).

Considere, por exemplo:

EXIT_CODE=0
false || ( echo "At least ..." ; EXIT_CODE=1; echo "code: ${EXIT_CODE}" )
echo "final code: ${EXIT_CODE}"

A saída será:

At least ...
code: 1
final code: 0

Sugiro não tentar ser muito chique:

if ! wait ${job}; then
    echo "At least ..."
    EXIT_CODE=1;
fi
    
por 13.02.2017 / 17:18