Я использовал strace -e clone,execve -f -p $$&
, чтобы увидеть, что делает текущая оболочка при запуске echo-версии и / bin / echo-версии.Я поставил &
, чтобы он продолжал читать команды.
В версии / bin / echo я считаю, что bash сделал ярлык и выполнил подпрограмму () для / bin / echo, поэтомуловушка больше не существует (ловушки не выживают execve, я полагаю).
В голой версии echo это встроенная оболочка, поэтому выполнять ее не нужно, поэтому подоболочка current () завершается какshell, и ловушка называется.
Теперь, еще одна странная вещь, если я сделаю это: bash -c 'a=$(trap "echo trapped" EXIT && /bin/echo hi); echo $a'
, вы увидите, что она захвачена!
Я думаю, это потому, что bash делаетярлык только в интерактивном режиме.Другое примерное отличие между пакетным режимом и интерактивным режимом - for x in $(seq 1 30); sleep 1; done
.Если вы введете его в терминал и сразу нажмете Cz и нажмете fg
, чтобы вернуть его, вы увидите, что он немедленно выйдет - остальные спящие пропускаются.Если вы поместите его в скрипт, а Cz, fg, он будет продолжать спать для оставшихся циклов.