尽管设置了 -T,bash DEBUG 陷阱不会被子 shell 继承

尽管设置了 -T,bash DEBUG 陷阱不会被子 shell 继承

我在用着:

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

鉴于:

#!/bin/bash
validate() {
    if [[ "$BASH_COMMAND" == whoami ]]; then
        echo "whoami detected!"
    fi
}
$ set -T
$ trap 'validate' DEBUG
$ shopt -s extdebug

然后如果我写whoami,我会得到“whoami detectors”。

但是如果我使用脚本:

#!/bin/bash
whoami

并运行它:

./script.sh

我没有收到消息。

根据文档:

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

为什么它不起作用?

请注意,这whoami仅用于说明目的。

答案1

运行脚本./script.sh不会在子 shell 中运行,而是在不会从父 shell 继承 shell 状态(如陷阱)的新 shell 中运行。请参阅我对 Stackoverflow 问题的回答“bash 脚本是否在新 shell 或子 shell 中执行?”更多细节。

如果要在子 shell 中运行脚本,可以使用( )创建子 shell 和/source.在该子 shell 中运行脚本:

(source script.sh)

请注意,由于这是在父 shell 的上下文中运行脚本,因此某些事情将与正常运行(使用它自己的 shell)有所不同。一方面,它的 shebang 行将被忽略,包括其中的任何选项(例如,如果 shebang 行是#!/bin/bash -u,但您source从 zsh 中运行它,它将在没有-u设置选项的情况下在 zsh 中运行)。可能存在其他差异/异常,具体取决于脚本的具体功能。

相关内容