#bash #exit #bash-trap #terminology
#bash #exit #bash-trap #терминология
Вопрос:
Пожалуйста, рассмотрите:
scripttmp=$(mktemp -d)
cleanup() {
rm -rf "${scripttmp}"
}
trap cleanup EXIT
Я понимаю cleanup
, что это функция обратного вызова (ed), поскольку она вызывается непосредственно перед выходом из основной функции, частью которой она является (я понимаю основную функцию как функцию в общем смысле, хотя в ее коде нет синтаксиса функции).
Если я никогда не вызывал cleanup
раньше — я на самом деле не «перезваниваю»; Я просто вызываю его перед выходом, но не «назад».
Является ли этот термин trap
более точным, чем общий термин «обратный вызов» в программировании?
Комментарии:
1. Нет, обратный вызов — слишком широкая терминология. «trap» — это обратный вызов для сигналов unix.
Ответ №1:
«Обратный вызов» происходит из-за того факта, что вы предоставляете подпрограмме фрагмент кода для последующего выполнения (всякий раз, когда выполняется какое-либо условие), и подпрограмма «перезванивает», выполняя этот код.
Сравните это с предоставлением кому-либо своего номера телефона, когда он им понадобится. Когда им это нужно, они перезванивают вам. В этот момент они, возможно, никогда не звонили вам раньше. Процесс «вызова» — это обратный вызов.
В сценарии оболочки trap
используется для установки обратного вызова, который будет оцениваться, когда сигнал «пойман» или «захвачен». Стандартная оболочка также позволяет перехватывать специальное событие, а именно, когда оболочка завершается ( EXIT
) , и bash
оболочка дополнительно поддерживает перехват ошибок ( ERR
), выход из функции ( RETURN
) и каждую простую команду ( DEBUG
).
trap
Утилита не позволяет вызывать функцию обратного вызова для общих асинхронных событий.
В вашем примере cleanup
можно вызвать функцию обратного вызова. Он устанавливается trap
и будет выполняться непосредственно перед выходом текущей оболочки. Другими словами, trap
утилита устанавливает EXIT
trap, который будет вызывать функцию обратного cleanup
вызова при EXIT
обнаружении события.
Код, установленный с помощью trap action event
, будет выполняться способом, эквивалентным eval action
тому, когда event
происходит данное. Следовательно action
, это может быть любой код оболочки, не обязательно просто вызов функции.
Другим словом для вашей cleanup
функции будет «обработчик», подпрограмма, которая что-то обрабатывает (в данном случае обрабатывает завершение сценария), и, возможно, более конкретно « EXIT
обработчик». Если бы он использовался для обработки перехваченного сигнала, это был бы «обработчик сигнала для этого конкретного сигнала». Также часто эту функцию называют «обработчиком trap» (обработчик, установленный trap
) или просто «trap», хотя это не «более точно».
Комментарии:
1. Спасибо за ответ, дорогой Кусалананда; вы бы сказали, что действительно термин обратный вызов проблематичен и сбивает с толку, если нам приходится сравнивать его с телефонным звонком, когда кто-то перезванивает нам по телефону ?…
2. @JohnDoea Нет, я бы так не сказал. Это общепринятый термин для такого рода вещей в программировании в целом.
3. Не могли бы вы сказать, что может быть лучший термин, который не будет иметь такой возможной путаницы, как позвонить нам снова (по телефону), а просто «позвонить нам»?
4. @JohnDoea В своем ответе я привел несколько альтернатив: обработчик, обработчик сигналов, обработчик ловушек и ловушка. Из них термин «trap» является наиболее вводящим в заблуждение, поскольку он фактически не улавливает сигнал (он выполняется фактическим trap).
5. @JohnDoea При использовании
trap action EXIT
ловушка устанавливается на момент завершения работы скрипта. Сигнал не задействован. Однако использованиеtrap action TERM
задает действие приTERM
получении сигнала.EXIT
,RETURN
,DEBUG
иERR
являются специальными условиями, которые не связаны с перехватом сигнала.
Ответ №2:
Термин «обратный вызов» в любом случае не подразумевает, что его нужно вызывать снова (он НЕ называется callagain или тому подобное).
Это просто означает, что вызывающий абонент сообщает вызываемому абоненту, как уведомить его при некотором определенном условии (так как тогда перезвонить ему) — или какое действие предпринять при этом условии (от имени, выполнение действия возвращается к вызывающему абоненту, поскольку вызывающий инициировал это действие, передав егоcalle как обратный вызов).
Таким образом, формулировка обратного вызова очень понятна и последовательна.
Итак, для примера @Kusalananda существуют разные возможности.
Обычно один (или один пакет) обратных вызовов передается вызываемому (подпрограмме, кому-то). Четко определено, какой тип (ы) информации (ов) вызываемый абонент будет предоставлять обратному вызову (поэтому передайте его в качестве аргументов подпрограмме или сообщите об этом по телефону получателю вызова). Возможно, это вообще не информация, просто вызов подпрограммы или телефонный звонок (поэтому, когда обратный вызов определен как не имеющий аргументов или необязательных аргументов). Но в любом случае обычно вызывающий абонент имеет некоторое намерение передать обратный вызов вызываемому абоненту, поэтому определенная процедура обратного вызова или тот, чей телефон звонит (это также может быть компьютер, который получает входящий вызов), делает что-то, что инициировал вызывающий абонент, когда он передал этот обратный вызов вызываемому абоненту (поэтому вызывающий абонентдействие возвращается к нему, независимо от того, может ли цель идентифицировать вызывающего абонента или нет). Конечно, обратный вызов может быть определен таким образом, что вызываемый абонент, вызывающий обратный вызов, всегда передает некоторую информацию процедуре обратного вызова или тому, кто отвечает на телефонный звонок, это может быть некоторая подробная информация о состоянии, некоторая информация, собранная промежуточным вызовом, или даже ссылка на оригиналвызывающий.
С другой стороны, trap — это очень специфическое слово, и оно совсем не похоже или взаимозаменяемо с обратным вызовом. Это означает, что примерно таков официальный перевод / определение произносимого слова trap . Ловушка не вызывается вызываемым абонентом и не передается вызываемому абоненту. Вызываемый абонент может быть пойман в ловушку. В вашем примере выше calee — это просто оставшаяся процедура, следующая после установки trap (до момента, когда trap удаляется или деактивируется). Ловушка каким-то образом противоположна обратному вызову, поскольку вызываемый объект (или ловушка, введенная вызываемым объектом) улавливает некоторое условие, но из-за пределов возможного контекста calees.
Комментарии:
1. Ну, я не понял ответа Кусалананды (я обычно всегда понимаю его, на мой взгляд, в целом отличные ответы, и это видно по количеству его ответов, которые я принял и получил в Unix и LInux SE).
2. На самом деле я до сих пор не понимаю этого термина, но я не в отчаянии от этого. Пожалуйста, просмотрите, например:
3. cs.stackexchange.com/questions/119747/…
4. retrocomputing.stackexchange.com/questions/13479/…
5. Пожалуйста, попробуйте ответить там; возможно, это поможет мне наконец понять этот термин из этих контекстуальных и более простых вопросов. С благодарностью — Джон,