2

Что означает set -T в bash? Что оно делает? Я считаю, что это связано с ловушками в Unix, но я не уверен.

Я нашел это:

Многие из таких конструкций становятся более простыми, если ловушки будут вызываться немедленно, пока дочерний план на переднем плане еще работает. Вы бы просто установили обработчик ловушек, который «что-то» делает с проблемой, и он будет вызываться каждый раз, когда вы нажимаете SIGINT (или SIGQUIT). Так же, как обработчик сигналов в программах на C вызывается сразу. Может быть, я слишком большой программист на Си, но я считаю, что задержанное поведение sh не очень интуитивно понятно.

#! /bin/sh

onsig()
{     trap SIGINT     kill -SIGINT $$
}
set -T            # set async execution of traps on FreeBSD
trap onsig SIGINT
./some-blocking-program
set +T            # set traps execution behaviour back to normal

Это делает обработчик ловушек немного более сложным, но позволяет вам, как обычно, написать основную часть сценария оболочки, не учитывая, что программа может блокироваться, и предпринимая соответствующие действия.

2 ответа2

9

Из help set:

  -T  If set, the DEBUG trap is inherited by shell functions.

Поэтому, если вы используете trap для вызова функции в DEBUG (то есть, почти перед каждой командой в сценарии оболочки), а затем вызываете другой сценарий оболочки, прерывание также будет происходить в этом сценарии. Без этой опции ловушка не будет существовать в подоболочке, и вызванный в ней скрипт будет работать без прерывания.

2

это то, что говорит man bash (подсказка: это огромный файл, я обычно ищу ..lotsofspaces..set)

If  set,  any  traps  on  DEBUG and RETURN are inherited by
shell functions, command substitutions, and  commands  exe-
cuted  in  a  subshell  environment.   The DEBUG and RETURN
traps are normally not inherited in such cases.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .