请考虑:
scripttmp=$(mktemp -d)
cleanup() {
rm -rf "${scripttmp}"
}
trap cleanup EXIT
我知道cleanup
是一个“回调(回调)”函数,因为它刚好在退出主函数之前被调用(我理解为一个一般意义上的函数,即使周围没有函数语法所有代码)。
如果情况是我以前从未真正打电话过cleanup
,而且这是第一次,我并不是真的“回叫”-我只是在退出前叫它,而不是“回叫”
trap
一词在编程中比通用“回调”一词更准确吗?
答案 0 :(得分:2)
“回调”来自以下事实:您为例程提供了一段代码以供以后执行(对于满足某些条件的任何时候),并且例程通过执行该代码来“回调”。
将此与给某人您需要的电话号码进行比较。当他们需要时,他们会给您回电。那时,他们可能从未打电话给您。
在shell脚本中,trap
用于安装一个回调,当信号被“捕获”或“捕获”时将对其进行评估。标准外壳还允许在外壳退出(EXIT
时捕获点,而bash
外壳还支持捕获错误(ERR
),从函数退出(RETURN
),以及每个简单的命令(DEBUG
)。
trap
实用程序不允许为通用异步事件调用回调函数。
在您的示例中,cleanup
可以称为回调函数。它与trap
一起安装,将在当前shell退出之前执行。换句话说,trap
实用程序将安装一个EXIT
陷阱,该陷阱将调用回调函数cleanup
。
在发生给定的trap action event
时,将以与eval action
等效的方式执行event
安装的代码。因此action
可以是任何shell代码,而不必只是函数调用。
您的cleanup
函数的另一个词是“处理程序”,一个处理某些事情的例程,可能更具体地讲是“ EXIT
处理程序”。如果用于处理捕获的信号,则将是“该特定信号的信号处理程序”。通常也将此功能称为“陷阱处理程序”(由trap
安装的处理程序)或仅称为“陷阱”,尽管这并不“准确”。
答案 1 :(得分:0)
我不知道为什么您再次对此表示赞赏,尽管例子“很差”,但答案还是不错的。
“回叫”一词并不意味着必须再次调用(它不被称为callagain等)。
这仅表示呼叫者告诉被呼叫者如何在某个已定义的条件下通知他(因此又如何给他回电)-或在该条件下采取哪种操作(代表该操作的执行返回到作为调用方的调用方通过将该操作移交给被调用方作为回调发起了该操作)。
因此,措辞回调非常清晰且一致。
因此对于@Kusalananda示例,存在不同的可能性。
通常,将单个(或单个批次)回调移交给被调用方(例程,某人)。明确定义了被叫方将提供给回调的信息类型(因此,应将其作为例程的参数提供给该例程,或在电话中告知该呼叫的接收者)。可能根本就没有信息,仅仅是对例程的调用或电话(因此,当回调被定义为没有参数或可选参数时)。但是无论如何,通常情况下,呼叫者有某种意图将回调移交给被呼叫者,因此,已定义的回调例程或电话正在响铃的人(也可以是获取来电的计算机)正在执行呼叫者在以下情况下启动的操作他将回调回调给了被呼叫者(因此,无论目标是否可以识别呼叫者,操作都将返回给他)。当然,可以通过以下方式来定义回调:调用回调的被叫方总是将一些信息移交给回调例程或接听电话的人,这可以是有关条件的一些详细信息,也可以是某些信息。被调用方之间,甚至是对原始调用方的引用。
另一方面,陷阱是一个非常具体的词,与回调没有任何相似之处或互换性。这意味着关于口语陷阱的正式翻译/定义是什么。陷阱不会被调用方调用,也不会移交给被调用方。被呼叫者可能被困。在上面的示例中,calee只是安装陷阱后的剩余步骤(直到陷阱被卸载或停用)。陷阱在某种程度上与回调相反,因为被调用者(或被调用者安装的陷阱)从某些可能的caleles上下文之外捕获某些条件。