![在 bash 中设置 -T - 它起什么作用?](https://linux22.com/image/1285514/%E5%9C%A8%20bash%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%20-T%20-%20%E5%AE%83%E8%B5%B7%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
在 bash 中是什么set -T
意思?它有什么作用?我相信它与 Unix 中的陷阱有关,但我不确定。
我发现这:
如果在前台子进程仍在运行时立即调用陷阱,许多此类构造就会变得更加简单。您只需安装一个陷阱处理程序,它会对问题执行“某些操作”,并且每次您遇到 SIGINT(或 SIGQUIT)时都会调用它。就像 C 程序中的信号处理程序被立即调用一样。也许我太像 C 程序员了,但我发现延迟的 sh 行为非常不直观。
#! /bin/sh onsig() { trap SIGINT kill -SIGINT $$ } set -T # set async execution of traps on FreeBSD trap onsig SIGINT ./some-blocking-program set +T # set traps execution behaviour back to normal
这使得陷阱处理程序稍微复杂一些,但它允许您像往常一样编写 shell 脚本的主要部分,而不必考虑程序可能会阻塞并对其采取适当的操作。
答案1
从help set
:
-T If set, the DEBUG trap is inherited by shell functions.
因此,如果您使用trap
来调用函数DEBUG
(即,几乎在 shell 脚本中的每个命令之前),然后调用另一个 shell 脚本,则该脚本中也会发生捕获。如果没有此选项,子 shell 中将不存在捕获,并且其中调用的脚本将不被捕获地运行。
答案2
这就是man bash
所说的(提示:这是一个巨大的文件,我通常会搜索..lotsofspaces..set
)
If set, any traps on DEBUG and RETURN are inherited by
shell functions, command substitutions, and commands exe-
cuted in a subshell environment. The DEBUG and RETURN
traps are normally not inherited in such cases.