私のビルド/配布スクリプトは期待どおりに機能しません。レプリケーションまたはビルドが失敗しても続行され、再起動が呼び出されます。 0を返すからだと思いますが、内部コマンドで結果を返したいのですが、「clone」ではレプリケーションが成功した場合にのみレプリケートされたフォルダに移動したいのですが、どうすれば作成できますか?このスクリプトをどのように改善しますか?
function clone {
git clone /volume1/repos/project.git
cd project
return 0
}
function build {
docker build -t project .
return 0
}
function cleanup {
...
}
function restart {
...
docker run ...
}
trap cleanup EXIT
if clone && build; then
restart
exit 0
else
echo Failed...
exit 1
fi
答え1
はい、指摘したように、関数は常にaを返すので、0
常に成功を返します。何があっても。最も簡単な解決策は、関数が何も返さないようにすることです。
function clone {
git clone /volume1/repos/project.git
cd project
}
function build {
docker build -t project .
}
man bash
次に、最後のコマンド実行(から)の終了ステータスを返します。
実行時の関数の終了状態は、関数本体内で実行された最後のコマンドの終了状態です。
もちろん、clone
関数の最後のコマンドはそれで失敗しましたが、成功しても関数はまだ成功を返すというcd
意味です。これを防ぐには、gitコマンドの終了ステータスを変数に保存し、関数にその変数を返すようにします。git clone
cd project
function clone {
git clone /volume1/repos/project.git
out=$?
cd project
return $out
}
またはより良いかもしれません。
function clone {
git clone /volume1/repos/project.git && cd project
}
コマンドを組み合わせてコマンドのいずれかが失敗すると、関数は失敗を返します。
答え2
関数を次のように修正してください。
function clone {
if git clone /volume1/repos/project.git; then
cd project
return 0
else
return 1
fi
}
function build {
docker build -t project .
}
これにより、そのコマンドが失敗した場合、関数は正しく終了します。この関数はdockerコマンドの終了状態のみを返すので、明示的に何も返す必要はありませんbuild
。ただし、さらにコマンドを追加する場合は、この関数と同様に設定する必要がありますclone
。