Apakah sinyal 0 pada perintah trap?

12

Saya mengikuti panduan ini tentang cara mengatur otentikasi SSH tanpa kata sandi dengan ssh-agent.

Untuk memulai ssh-agent, penulis merekomendasikan kode berikut dalam .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

Saya tidak mengerti mengapa ini menjebak sinyal 0. Menurut sinyal manusia 7 tidak ada sinyal seperti itu.

Apakah ini hanya kesalahan ketik atau bug atau apakah ini benar-benar mencapai sesuatu?

Christoph Wurm
sumber

Jawaban:

19

Dari manual bash :

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

... Jika sigspec adalah EXIT (0) perintah arg dieksekusi saat keluar dari shell.

Tikar
sumber
13
Benar. Jika pembaca datang ke sini karena judul pertanyaan, perhatikan bahwa ini adalah makna dari perintah 0shell trap. Ketika mengirim sinyal dengan kill, nomor sinyal 0 berarti tidak mengirim sinyal sama sekali; ini adalah cara menguji keberadaan proses target.
Gilles 'SANGAT berhenti menjadi jahat'
@Mat: Terima kasih banyak. Saya sedang membaca jebakan manusia 1 ...
Christoph Wurm
1
Tapi itu tidak ada dalam daftar keluaran oleh trap -l!
amphetamachine
bisakah Anda mengatasi kasus ini ketika skrip bersumber?
Eric
1

Seperti yang ditunjukkan @Mat dalam jawabannya, SIGSPEC 0, saat digunakan pada trapperintah akan menyebabkan trapperintah dijalankan ketika skrip keluar.

Contoh ini menggambarkan apa yang terjadi.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

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

while [ 1 ]; do
    sleep 3
done

Ketika kami menjalankan ini:

$ ./tr.bash 
PID: 24086

Itu duduk di sini menunggu tanpa batas. Di jendela lain jika sekarang kami mengirim killsinyal ke sana Anda akan melihat bahwa a kill -0tidak akan membunuh proses, meskipun sinyal 0 tercantum dalam trapperintah.

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

Namun jika kita killscript menggunakan sinyal 1, kill -1:

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

Kita akan melihat bahwa skrip keluar, dan mencetak pesan, "hai" 2 kali. Yang pertama untuk sinyal 1, dan yang kedua karena skrip keluar.

$ ./tr.bash 
PID: 24086
hi
hi
slm
sumber
0

trap on 0 dijalankan ketika shell keluar. Ini biasanya digunakan untuk membersihkan file tmp di satu tempat yang selalu dijalankan:

tmp = / tmp / myscript. $$

trap 'rm -f $ tmp; keluar '0 1 2 15

do_a_bunch_of_stuff

keluar

pintu keluar di ujung perangkap keluar dari shell saat pembersihan dengan status yang benar.

dbrower
sumber