2

エラー時に bash シェル スクリプトを完全に終了/終了したいのですが、error終了前にデバッグ出力を表示できる関数を使用しています。exit 1関数の出力がバッククォートまたは$().

これが私のサンプルスクリプトです:

    #!/bin/bash

    function error ()
    {
            echo "An error has occured: $1"
            exit 1
    }
    function do_sth ()
    {
            if [ $1 -eq 0 ]; then
                    error "First param must be greater than 0!"
            else
                    echo "OK!"
            fi
    }

    RESULT=`do_sth 0`

    echo "This line should never be printed"

error()関数内のスクリプトをすぐに終了するにはどうすればよいですか?

4

5 に答える 5

4

コマンド置換の問題は、サブシェルの実行が開始されることdo_sthです。exit 1次に、メインの bash ではなく、このサブシェルを終了します。

|| exit $?コマンド置換からの終了コードで終了する を追加することで、これを回避できます。

RESULT=`do_sth 0` || exit $?

エラー メッセージを表示する場合は、stderr にリダイレクトします。

echo "An error has occured: $1" >&2
于 2013-01-17T12:15:34.400 に答える
1
RESULT=`do_sth 0` || exit $?

次に echo "エラーが発生しました: $1" >&2

于 2013-01-17T14:38:00.040 に答える
0

サブシェルが親を直接終了させることができないという事実を回避する方法はありません。親は、サブシェルから返された値を評価する必要があります。一般的な手法は、終了をトラップし、トラップ関数でエラー メッセージを出力することです。サブシェルでエラー メッセージを生成しているため、他の方法で行われるように単純にメッセージを変数に割り当てることはできませんが、ファイル システムを使用することはできます。この考え方は本当にばかげていることに注意してください。単純にエラー メッセージを stderr に書き込む方がはるかにクリーンです。それがそのためであり、それが子供たちに受け継がれる理由です。何かのようなもの:

#!/bin/sh

trap final 0 2 15

# Create a temporary file to store error messages.  This is a terrible
# idea: it would be much better to simply write error messages to stderr,
# but this code is attempting to demonstrate the technique of having the
# parent print the message.  Perhaps it would do better to serve as an example
# of why reporting your children's mistakes is a bad idea.  The children
# should be responsible for reporting their own errors.  Doing so is easy,
# since they inherit file descriptor 2 from their parent.
errmsg=$( mktemp xxxxx )
final() {
    test "$?" = 0 || cat $errmsg
    rm -f $errmsg
} >&2

# Must emphasize one more time that this is a silly idea.  The error 
# function ought to be writing to stderr: eg echo "error: $*" >&2
error() { echo "error: $*" > $errmsg; exit 1; }
do_sth() { 
    if test "$1" -eq 0; then
        error "First param must be greater than 0!"
    else
        echo "OK!"
    fi
}


result=$( do_sth 0 ) || exit 1
echo not printed
于 2013-01-17T13:30:36.070 に答える
0

これはうまくいくはずです...

#!/bin/bash

trap "exit 1" 50                                       #exit process after receiving signal 50.

function myerror ()
{
    echo "An error has occured: $1" >&2
}
function do_sth ()
{
    if [ $1 -eq 0 ]; then
        myerror "First param must be greater than 0!"
        kill -50 $(ps --pid $$ -opid=)                 #uncommon signal 50 is used.
    else
        echo "OK!"
    fi
}

RESULT=`do_sth 1`
echo $RESULT

RESULT=`do_sth 0`
echo $RESULT

echo "This line should never be printed"
于 2013-01-17T14:56:22.520 に答える
0

(賢い)答えは@FatalErrorによる別の質問のトップの答えにあるようです。

于 2013-01-17T14:05:55.613 に答える