我在用着:
$ 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 中运行)。可能存在其他差异/异常,具体取决于脚本的具体功能。