10

次のスニペットを実行します。

#!/bin/bash

function preexec ()
{
    echo -e "\n-->preexec command: $BASH_COMMAND"
}
trap 'preexec' DEBUG

function testfunc ()
{
    echo "testfunc called $1"
}

testfunc "main"
source "source.sh"

exit 0


ここで、source.shは

#!/bin/bash

testfunc "source"


与える:

-->preexec command: testfunc "main"
testfunc called main

-->preexec command: source "source.sh"
testfunc called source

-->preexec command: exit 0


これは、ソースファイル内のすべてのコマンドがDEBUGトラップによってトラップされないことを意味します。
実際、行を追加すると

trap 'preexec' DEBUG

2行目のsource.sh内では、すべてが希望どおりに機能します(ソースファイル内のコマンドもトラップされます)。

ソースを作成する必要のあるファイルに対して上記の行が繰り返されないようにするには、これをデフォルトの動作にするにはどうすればよいですか?言い換えると、ソースファイルにDEBUGトラップを継承するように指示する機会はありますか?

4

1 に答える 1

14

メインファイルの設定を解決しました:

set -o functrace


BASH manから:

設定されている場合、DEBUGおよびRETURNのトラップは、シェル関数、コマンド置換、およびサブシェル環境で実行されるコマンドによって継承されます。このような場合、通常、DEBUGトラップとRETURNトラップは継承されません。

シェル関数の「ソース」であるため、これらは継承されます。

于 2013-02-03T15:53:45.453 に答える