if文と関数呼び出しを使用したビルドスクリプトの作成

if文と関数呼び出しを使用したビルドスクリプトの作成

私のビルド/配布スクリプトは期待どおりに機能しません。レプリケーションまたはビルドが失敗しても続行され、再起動が呼び出されます。 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 clonecd 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

関連情報