1

この Bash スクリプトは期待どおりに動作します。

test_this.sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
run_this

印刷します

1
TRAPPED

ただし、この関数をエクスポートしようとすると、トラップに失敗します。

test_this2.sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
export -f run_this

コマンドラインでこれを入手して実行します。

> source test_this2.sh
> run_this

結果は

1

罠はどこに行った?

4

2 に答える 2

1

シェル(関数がエクスポートされる場所) から出力する場合は、出力する が存在しないため、関数を使用trapする場合は無視されます (つまり、 が存在しない場合はシェルがなくなります) 。で実行します。関数が完了すると、元に戻ります--出口はありません。を実行すると で実行され、終了すると出力されます。を実行したときに何が起こるかを本当に知りたい場合は、入力してみて何が起こるかを確認してください。exportexitloginshelltrappedexitsource test_this2.shlogin shelllogin shelltest_this.shsubshellsubshelltrappedexitlogin shellexit

于 2014-11-26T02:06:45.750 に答える
1

関数を「トラップ」したい場合は、RETURN シグナルを使用します。ERR シグナルを使用して、「false」呼び出しなどのエラーを「トラップ」します。

test_this.sh

function run_this() {
    trap "echo LEAVING" RETURN
    trap "echo ERROR" ERR
    false
    echo $?
}
export -f run_this

関数の読み込みとエクスポート

source this_this.sh

試して

run_this

戻り値

ERROR
1
LEAVING

サブシェルを開始

bash

再テスト

run_this

戻り値

ERROR
1
LEAVING

したがって、エクスポートは正常に機能します。

PS: bash 4.3.42 を使用しています

于 2016-04-11T09:36:38.207 に答える