Como posso desabilitar o xtrace e preservar meu código de saída?

1

Estou tentando descobrir uma boa maneira de desativar o xtrace antes de sair de um script. Todos eles estão sendo executados pela Wercker, uma integração contínua e implantação de SaaS.

Um script anterior foi executado, ativando o xtrace

+ echo 7ad27e6b-75d9-4e72-a9a7-8b0d6796bd75 0
source "/pipeline/maven-9ea06b71-4392-4fec-ab5a-db7389b49cf2/run.sh" < /dev/null
+ source /pipeline/maven-9ea06b71-4392-4fec-ab5a-db7389b49cf2/run.sh
++ set +o xtrace ## disabling here to keep other area's quiet
...
++ '[' -e settings.xml ']'
++ SETTINGS=--settings=settings.xml
++ mvn --update-snapshots --batch-mode -Dmaven.repo.local=/pipeline/cache --settings=settings.xml deploy
...
+ echo f5b142ac-a369-4166-967e-688d46c642c8 0

aqui meu código atual

if [ -n "$WERCKER_MAVEN_DEBUG" ]; then
    set -o xtrace
    case "$WERCKER_MAVEN_DEBUG" in
        [1-2]) env;;
        [1-3]) DEBUG="--debug";;
    esac
fi

if [ -e "$WERCKER_MAVEN_SETTINGS" ]; then
   SETTINGS="--settings=${WERCKER_MAVEN_SETTINGS}"
fi

mvn --update-snapshots \
    --batch-mode \
    -Dmaven.repo.local=${WERCKER_CACHE_DIR} \
    ${SETTINGS} ${DEBUG} \
    ${WERCKER_MAVEN_GOALS}

quando eu tento desabilitar o xtrace com set +o xtrace na parte inferior do arquivo que alterou o retorno para sempre ser 0, e mesmo se o maven estivesse falhando, ci não era. Eu então tentei capturar mavens return e chamar exit ${STATUS} , mas isso causou uma falha mesmo quando o maven estava tendo sucesso com o status 0. Eu acho que tinha algo a ver com a chamada exit, não com como eu estava capturando o código.

Como posso desabilitar xtrace após mvn ter sido executado enquanto preservo o status de devolução de mavens para o script de chamador?

    
por xenoterracide 06.09.2015 / 02:22

2 respostas

1

Você pode envolver sua função em um subshell, tornando o set -o xtrace afetado apenas no subshell:

run() (
  if [ -n "$WERCKER_MAVEN_DEBUG" ]; then
      set -o xtrace
      case "$WERCKER_MAVEN_DEBUG" in
          [1-2]) env;;
          [1-3]) DEBUG="--debug";;
      esac
  fi

  if [ -e "$WERCKER_MAVEN_SETTINGS" ]; then
      SETTINGS="--settings=${WERCKER_MAVEN_SETTINGS}"
  fi

  mvn --update-snapshots \
      --batch-mode \
      -Dmaven.repo.local=${WERCKER_CACHE_DIR} \
      ${SETTINGS} ${DEBUG} \
      ${WERCKER_MAVEN_GOALS}
)

run
printf '%s\n' "$?"

Teste simples:

$ cat test.sh
#!/bin/sh

run() (
  set -o xtrace
  return 1
)

run
printf '%s\n' "$?"

Execute:

$ ./test.sh
+ return 1
1
    
por 06.09.2015 / 06:11
1

Eu refatorei o código em funções, a função que importa para este caso é disable_xtrace_and_return_status e como ele retorna o status capturado do maven em execução. Embora eu tenha me enganado em pensar que isso estava funcionando antes ...

function disable_xtrace_and_return_status() {
    set +o xtrace
    return $1
}

function run() {
    if [ -n "$WERCKER_MAVEN_DEBUG" ]; then
        if [ "$WERCKER_MAVEN_DEBUG" -ge "1" ]; then
            set -o xtrace

            if [ "$WERCKER_MAVEN_DEBUG" -ge "2" ]; then
                env

                if [ "$WERCKER_MAVEN_DEBUG" -ge "3" ]; then
                    local debug="--debug"
                fi
            fi
        fi
    fi

    if [ -e "$WERCKER_MAVEN_SETTINGS" ]; then
       local settings="--settings=${WERCKER_MAVEN_SETTINGS}"
    fi

    mvn --update-snapshots \
        --batch-mode \
        -Dmaven.repo.local=${WERCKER_CACHE_DIR} \
        ${settings} ${debug} \
        ${WERCKER_MAVEN_GOALS}

   disable_xtrace_and_return_status $?
}

run;
    
por 06.09.2015 / 03:54