Что такое сигнал 0 в команде trap?


12

Я следую этому руководству о том, как настроить SSH-аутентификацию без пароля с помощью ssh-agent.

Для запуска ssh-agent автор рекомендует следующий код в .bash_profile:

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

Я не понимаю, почему это сигнал захвата 0. По сигналу человека 7 такого сигнала нет.

Это просто опечатка или ошибка, или это действительно чего-то добиться?

Ответы:


19

Из руководства по bash :

trap [-lp] [[arg] sigspec ...]

... Если sigspec - EXIT (0), команда arg выполняется при выходе из оболочки.


13
Верный. Если читатель пришел сюда из-за заголовка вопроса, обратите внимание, что это значение команды 0shell trap. При отправке сигнала с killномером 0 означает, что сигнал не отправляется в конце концов; это способ проверки существования целевого процесса.
Жиль "ТАК - перестань быть злым"

@ Мат: Большое спасибо. Я читал 1 ловушку для человека ...
Кристоф Вурм

1
Но это не в списке вывода по trap -l!
амфетамина

Можете ли вы рассмотреть случай, когда сценарий поставлен?
Эрик

1

Как показывает @Mat в своем ответе, SIGSPEC, равный 0, при использовании в trapкоманде вызовет выполнение trapкоманды при выходе из сценария.

Этот пример иллюстрирует, что происходит.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

trap 'echo hi; exit 1' 0 1 2 15

while [ 1 ]; do
    sleep 3
done

Когда мы запустим это:

$ ./tr.bash 
PID: 24086

Он сидит здесь в ожидании бесконечно. В другом окне, если мы сейчас отправим ему killсигналы, вы увидите, что a kill -0не убьет процесс, даже если в trapкоманде указан сигнал 0 .

$ kill -0 $(pgrep tr.bash)
$

Однако если мы killиспользуем сценарий, использующий сигнал 1 kill -1:

$ kill -1 $(pgrep tr.bash)
$

Мы увидим, что скрипт завершает работу и печатает сообщение «привет» 2 раза. Первый для сигнала 1, а второй из-за выхода из сценария.

$ ./tr.bash 
PID: 24086
hi
hi

0

ловушка на 0 запускается при выходе из оболочки. Обычно он используется для очистки файлов tmp в одном месте, которое всегда выполняется:

TMP = / TMP / MyScript. $$

trap 'rm -f $ tmp; выход '0 1 2 15

do_a_bunch_of_stuff

выход

выход в конце ловушки выходит из оболочки при очистке с правильным статусом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.