xtrace를 비활성화하고 종료 코드를 보존하는 방법

xtrace를 비활성화하고 종료 코드를 보존하는 방법

스크립트를 종료하기 전에 xtrace를 비활성화하는 좋은 방법을 찾으려고 노력 중입니다. 이는 지속적인 통합 및 배포 SaaS Wercker에 의해 수행됩니다.

이전 스크립트 중 하나가 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

이것은내 실제 코드

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}

set +o xtrace파일 하단에서 xtrace를 비활성화 하려고 할 때 반환 값을 항상 0으로 변경하면 maven이 실패하더라도 ci는 실패하지 않습니다. 그런 다음 Maven 반환을 캡처하여 호출하려고 시도했지만 exit ${STATUS}이로 인해 Maven이 상태 0으로 성공했음에도 불구하고 실패하게 되었습니다. 내 생각에 이것은 코드를 캡처하는 방식이 아니라 종료를 호출하는 것과 관련이 있는 것 같습니다.

실행 후 비활성화 xtrace하고 호출자 스크립트의 Maven 반환 상태를 유지하는 방법은 무엇입니까?mvn

답변1

코드를 함수로 리팩토링했는데, 이 경우 중요한 함수는 disable_xtrace_and_return_statusMaven 실행에서 캡처된 상태를 반환하는 방법입니다. 이것이 효과적이라고 스스로 속이곤 했지만...

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;

답변2

set -o xtrace서브셸 환경 내에서만 영향을 받도록 함수를 서브셸로 래핑할 수 있습니다 .

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' "$?"

간단한 테스트:

$ cat test.sh
#!/bin/sh

run() (
  set -o xtrace
  return 1
)

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

달리다:

$ ./test.sh
+ return 1
1

관련 정보