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