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

在 source.sh 中作为第二行,一切都按需要进行(源文件中的命令也被捕获)。

如何将其设为默认行为以避免对我需要获取的任何文件重复上述行?换句话说:有没有机会告诉源文件继承调试陷阱?

4

1 回答 1

14

我解决了主文件中的设置:

set -o functrace


来自 BASH 人:

如果设置,则 DEBUG 和 RETURN 上的任何陷阱都将由 shell 函数、命令替换和在子 shell 环境中执行的命令继承。在这种情况下,通常不会继承 DEBUG 和 RETURN 陷阱。

作为“源”一个shell函数,它们是被继承的。

于 2013-02-03T15:53:45.453 回答