一个源文件如何继承trap DEBUG?

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文件的第二行中,所有命令都会按预期运行(source文件中的命令也被捕获)。

我如何使此成为默认行为,以避免在需要使用source的任何文件中重复以上行为? 换句话说:有没有办法告诉所引用的文件继承DEBUG陷阱?

1个回答

15

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

set -o functrace


从BASH man:

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

由于'source'是一个shell函数,它们会被继承。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接