Является ли термин trap (из Bash) более точным, чем общий термин «обратный вызов» в программировании?

#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. Пожалуйста, попробуйте ответить там; возможно, это поможет мне наконец понять этот термин из этих контекстуальных и более простых вопросов. С благодарностью — Джон,