Що таке сигнал 0 у команді пастки?


12

Я слідую за цим посібником про те, як налаштувати безвірну SSH-аутентифікацію за допомогою ssh-агента.

Щоб запустити ssh-агент, автор рекомендує такий код у .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
Правильно. Якщо читач прийшов сюди через назву запитання, зауважте, що це значення команди 0оболонки trap. При надсиланні сигналу за допомогою kill, номер сигналу 0 означає, що нарешті не надсилати сигнал; це спосіб перевірки існування цільового процесу.
Жил 'ТАК - перестань бути злим'

@Mat: Велике спасибі Я читав людину 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не вбиває процес, навіть якщо сигнал 0 вказаний у trapкоманді.

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

Однак якщо ми killсценарій використовуємо сигнал 1 kill -1,:

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

Ми побачимо, що сценарій виходить і надрукує повідомлення "привіт" 2 рази. Перший для сигналу 1, а другий тому, що сценарій вийшов.

$ ./tr.bash 
PID: 24086
hi
hi

0

trap on 0 запускається, коли оболонка виходить. Зазвичай використовується для очищення файлів tmp в одному місці, яке завжди виконується:

tmp = / tmp / myscript. $$

пастка 'rm -f $ tmp; вихід '0 1 2 15

do_a_bunch_of_stuff

вихід

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.