0

ソースから 3 つのパッケージをインストールする bash スクリプトを作成しました。スクリプトはかなり単純で、 (ソース フォルダーに ing した後) ./configuremakemake installステートメントが 3 回書かれています。cd少しきれいに見せるために、次のように出力を別のファイルにリダイレクトしました./configure >> /usr/local/the_packages/install.log 2>&1

問題は、何らかの理由でいずれかのパッケージがコンパイルに失敗した場合 (これまでは常に正常に実行されていたため、理由はわかりません。これは追加したいものです)、スクリプトとロールバックを終了しました。

ロールバックは、指定された宛先フォルダーを削除するだけprefix=/install/pathだと思いますが、スクリプト自体を終了するにはどうすればよいですか?

4

3 に答える 3

3

おそらく、次のようなものが機能する可能性があります。

./configure && make && make install || rm -rf /install/path
于 2013-08-24T10:24:32.203 に答える
2

オプション1

$?bash 変数を使用して、スクリプトから実行された何かの戻りコードを確認できます。

moo@cow:~$ false
moo@cow:~$ echo $?
1
moo@cow:~$ true
moo@cow:~$ echo $?
0

オプション 2

ifこのようにコマンドをステートメントに直接入れて、戻りコードを確認することもできます。

moo@cow:~$ if echo a < bad_command; then echo "success"; else echo "fail"; fi
fail

戻りコードを反転する

コマンドのリターン コードは、文字で反転できます!

moo@cow:~$ if ! echo a < bad_command; then echo "success"; else echo "fail"; fi
success

スクリプト例

楽しみのために、あなたの質問に基づいてこのスクリプトを書くことにしました。

#!/bin/bash

_installed=()

do_rollback() {
    echo "rolling back..."
    for i in "${_installed[@]}"; do
        echo "removing $i"
        rm -rf "$i"
    done
}

install_pkg() {
    local _src_dir="$1"
    local _install_dir="$2"
    local _prev_dir="$PWD"
    local _res=0

    # Switch to source directory
    cd "$_src_dir"

    # Try configuring
    if ! ./configure --prefix "$_install_dir"; then
        echo "error: could not configure pkg in $_src_dir"
        do_rollback
        exit 1
    fi

    # Try making
    if ! make; then
        echo "error: could not make pkg in $_src_dir"
        do_rollback
        exit 1
    fi

    # Try installing
    if ! make install; then
        echo "error: could not install pkg from $_src_dir"
        do_rollback
        exit 1
    fi

    # Update installed array
    echo "installed pkg from $_src_dir"
    _installed=("${_installed[@]}" "$_install_dir")

    # Restore previous directory
    cd "$_prev_dir"
}

install_pkg /my/source/directory1 /opt/install/dir1
install_pkg /my/source/directory2 /opt/install/dir2
install_pkg /my/source/directory3 /opt/install/dir3
于 2013-08-24T15:21:22.327 に答える