web-dev-qa-db-ja.com

オプション-tを指定したdeclareの使用法は何ですか

コマンドhelp declareを呼び出す場合。次の情報が表示されます。

-t NAME :  to make NAMEs have the `trace' attribute

このオプションの使用法を示す例はありますか?これは、すべての関数ではなく引数にのみ適用されることを除いて、コマンドset -o functraceと同じ役割を果たしていると思いました。

この質問の動機は、関数fooにトラップを継承させたいということです。そこで、declare -t fooを試しましたが、機能しませんでした。

確かにset -o functraceを使用して、すべての関数にトラップを継承させることはできますが、1つまたは2つの関数だけにトラップを継承させたい場合があります。

スクリプトは次のとおりです。

function foo {
    var=1
    var=2
    var=3
}

declare -t foo

var=0

trap 'echo var is $var' DEBUG
    foo
trap - DEBUG    # turn off the DEBUG trap

スクリプトの出力は次のとおりです。

var is 0
var is 3

私は次のようなものを手に入れることを期待していました:

var is 0
var is 1
var is 2
var is 3
3
Jack Chen

declare -t foo変数fooにトレース属性を設定します(とにかく特別な効果はありません)。関数に設定するには、-fを使用する必要があります。

declare -ft foo

スクリプトを-fを使用するように変更すると、次の出力が得られます(コメントでの説明)。

var is 0 # foo called
var is 0 # before the first command in function is run
var is 0 # var=1
var is 1 # var=2
var is 2 # var=3
var is 3 # trap ...
8
muru