트랩 명령에서 신호 0은 무엇입니까?


12

ssh-agent를 사용하여 비밀번호없는 SSH 인증을 설정하는 방법에 대한 이 안내서 를 따르고 있습니다.

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을 트래핑하고 있는지 이해할 수 없습니다. man 7 신호 에 따르면 그러한 신호는 없습니다.

이것은 오타 또는 버그입니까? 아니면 실제로 무언가를 달성합니까?

답변:


19

로부터 bash는 설명서 :

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

... sigspec이 EXIT (0) 인 경우 arg 명령은 쉘 종료시 실행됩니다.


13
옳은. 질문 제목으로 인해 독자가 여기에 온 경우, 이것은 0trap명령 에서 의미라는 점에 유의하십시오 . 로 신호를 보낼 때 kill신호 번호 0은 결국 신호를 보내지 않음을 의미합니다. 이것은 목표 프로세스의 존재를 테스트하는 방법입니다.
Gilles 'SO- 악 그만해라'

@ 매트 : 감사합니다. 나는 사람 1 함정 을 읽고 있었다 ...
Christoph Wurm

1
그러나 그것은 목록 출력에 없습니다 trap -l!
amphetamachine

스크립트가 제공 될 때 문제를 해결할 수 있습니까?
Eric

1

@Mat이 그의 대답에서 알 수 있듯이, trap명령에 사용될 때 SIGSPEC가 0이면 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신호를 보내면 kill -0신호 0이 trap명령에 나열되어 있어도 프로세스가 종료되지 않는다는 것을 알 수 있습니다 .

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

그러나 우리의 경우 kill신호 1을 사용하여 스크립트 kill -1:

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

스크립트가 종료되고 "hi"메시지가 2 번 인쇄되는 것을 볼 수 있습니다. 첫 번째는 신호 1이고 두 번째는 스크립트가 종료 되었기 때문입니다.

$ ./tr.bash 
PID: 24086
hi
hi

0

쉘이 종료되면 trap on 0이 실행됩니다. 항상 실행되는 한 곳에서 tmp 파일을 정리하는 데 일반적으로 사용됩니다.

tmp = / tmp / myscript. $$

트랩 'rm -f $ tmp; 종료 '01 2 15

do_a_bunch_of_stuff

출구

트랩 끝의 종료는 올바른 상태로 정리시 쉘을 종료합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.