运行以下代码段:
#!/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里面作为第二行,一切都按照需要工作(源文件中的命令也被捕获)。
如何将此作为默认行为,以避免为我需要提供的任何文件重复上述行?
换句话说:有没有机会告诉源文件继承DEBUG陷阱?
答案 0 :(得分:9)
我解决了主文件中的设置问题:
set -o functrace
来自BASH男子:
如果设置,则DEBUG和RETURN上的任何陷阱都将由shell继承 子shell中执行的函数,命令替换和命令 环境。 DEBUG和RETURN陷阱通常不会继承 这种情况。
作为'source'一个shell函数,它们是继承的。