Это объясняется частично на странице руководства trap (1P) и больше в Advanced Bash Scripting Guide , где объясняется, что -
является Встроенный Bash, используемый для обозначения «конца параметров» для команды. Поскольку сценарии, использующие sh
, предназначены для переносимости между другими системами с его помощью, bash ведет себя так, как если бы он выполнялся с - posix
, что изменяет некоторое поведение оболочки в соответствии со спецификацией POSIX.
Когда сигнал "перехвачен" (например, EXIT
), он связывает первый аргумент после команды с сигналом, eval
- при выдаче сигнала , и игнорируя его нормальное поведение (кроме EXIT
). Итак, когда trap 'echo something' EXIT
запускается, затем exit
, оболочка eval 'echo something'
перед завершением работы. Это также будет работать с другим сигналом, таким как TERM
, который может быть привязан, например, к функции постепенного выхода в сценарии. Когда выполняется trap - EXIT
, -
интерпретируется как «конец аргументов», указывая trap
, что сигнал должен быть привязан к null ( ''
) (поскольку не было флагов до или после -
), указывающих оболочке игнорировать сигнал (однако это не работает с EXIT, но работает с другими сигналами). Запуск trap - 'echo something' EXIT
, однако, по-прежнему будет eval 'echo something'
и завершится после exit
.В соответствии со спецификацией ловушки
, команда -
сама по себе указывает, что оболочка сбросит все ловушки для указанных сигналов, поэтому она работает как в sh
] и Баш.