スクリプトを終了する前にxtraceを無効にする良い方法を見つけようとしています。これは、継続的な統合と展開のSaaS Werckerによって行われます。
以前のスクリプトの1つが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_status
Mavenの実行でキャプチャされた状態を返す方法です。これが効果的だと自らだまされたが…
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