术语陷阱(Bash)是否比编程中的通用术语 "callback" 更准确?

Is the term trap (of Bash) more accurate than the generic "callback" term in programming?

请考虑:

scripttmp=$(mktemp -d)

cleanup() {
    rm -rf "${scripttmp}"
}

trap cleanup EXIT

我知道 cleanup 是一个 call(ed)back 函数,因为它在退出 main 函数之前被调用,它是 (尽管其代码周围没有函数语法,但我将 main 函数理解为一般意义上的函数)。

如果我之前从未真正调用过 cleanup --- 我真的没有 "call it back";我只是在退出前调用它,而不是 "back".

术语 trap 是否比编程中的通用 "callback" 术语更准确?

"Callback" 源于这样一个事实,即您为例程提供了一段代码供以后执行(每当满足某些条件时),而例程 "calls back" 通过执行该代码。

将此与在需要时向某人提供您的 phone 号码进行比较。当他们需要时,他们会给您回电。那时,他们可能以前从未给您打电话。 "calling"的过程就是回调。

在 shell 脚本中,trap 用于安装将在信号为 "caught" 或 "trapped" 时评估的回调。标准 shell 还允许捕获特殊的 事件 ,即当 shell 退出时 (EXIT),以及 bash shell 还支持捕获错误 (ERR)、退出函数 (RETURN) 和每个简单命令 (DEBUG)。

trap 实用程序不允许为一般异步事件调用回调函数。

在您的示例中,cleanup 可以称为回调函数。它与 trap 一起安装,将在当前 shell 退出之前执行。换句话说,trap 实用程序安装了一个 EXIT 陷阱,当 EXIT 事件被捕获时,它将调用回调函数 cleanup

当给定的event发生时,trap action event安装的代码将以等同于eval action的方式执行。 action 因此可以是任何 shell 代码,不一定只是函数调用。

你的 cleanup 函数的另一个词是 "handler",一个处理某些事情的例程(在本例中,处理脚本的终止),可能更具体地说 "an EXIT handler".如果它用于处理捕获的信号,它将是 "the signal handler for that particular signal"。通常将此函数称为 "trap handler"(由 trap 安装的处理程序)或简称为 "trap",尽管这不是 "more accurate"。

术语 "call back" 并不意味着必须再次调用它(它不称为 callagain 等)。

它只是意味着调用者告诉被调用者如何在某个定义的条件下通知他(那么如何在那时调用他) - 或者在那个条件下采取什么行动(代表,行动的执行去返回给调用者,因为调用者通过将其作为回调移交给调用者来启动该操作)。

所以回调的写法非常清晰一致。

因此对于@Kusalananda 示例,存在不同的可能性。
通常单个(或单个批次)回调被移交给被调用者(例程,某人)。被调用者将提供给回调的信息类型已明确定义(因此将其作为参数提供给例程或在 phone 上告诉调用的接收者)。可能根本没有信息,只是对例程的调用或 telephone 调用(因此当回调定义为没有参数或可选参数时)。但是无论如何,通常呼叫者有一些意图将回调交给被呼叫者,所以定义的回调例程或 phone 正在响铃的例程(它也可以是接收来电的计算机)正在做某事调用者在他将该回调提供给被调用者时发起(因此操作返回到他,无论目标是否可以识别调用者)。当然,回调可以定义为调用回调的被调用者总是将一些信息传递给回调例程或回答 phone 的人,它可以是关于条件的一些详细信息,一些呼叫者在其间收集的信息,甚至是对原始呼叫者的引用。

另一方面,陷阱是一个非常具体的词,与回调完全不相似或不能互换。大概意思就是口语陷阱的官方translation/definition是什么意思。陷阱不被被调用者调用并且不被移交给被调用者。被调用者可能会被困住。在您上面的示例中,calee 只是安装陷阱后的剩余过程(直到卸载或停用陷阱)。陷阱在某种程度上与回调相反,因为被调用者(或被调用者安装的陷阱)捕获某些条件,但来自可能的调用上下文之外。