Bir tuzak komutunda sinyal 0 nedir?


12

Ssh-agent ile şifresiz SSH kimlik doğrulamasının nasıl ayarlanacağıyla ilgili bu kılavuzu takip ediyorum .

Ssh-agent'ı başlatmak için yazar aşağıdaki kodu önerir .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

Neden sinyal 0'ı hapsettiğini anlamıyorum. Adam 7 sinyaline göre böyle bir sinyal yoktur.

Bu sadece bir yazım hatası veya hata mıdır yoksa bu gerçekten bir şey başarır mı?

Yanıtlar:


19

Gönderen bash kılavuzu :

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

... Bir sigspec EXIT (0) ise, komut değişkeni kabuktan çıkışta yürütülür.


13
Doğru. Bir okuyucunun sorunun başlığı nedeniyle buraya gelmesi durumunda, bunun 0bir kabuk trapkomutunun anlamı olduğunu unutmayın . İle bir sinyal gönderilirken kill, 0 sinyal numarası sonuçta sinyal göndermemek anlamına gelir; bu, hedef sürecin varlığını test etmenin bir yoludur.
Gilles 'SO- kötü olmayı kes'

@Mat: Çok teşekkürler. Adam 1 tuzağını okuyordum ...
Christoph Wurm

1
Ancak listenin çıktısında değil trap -l!
amfetamachine

senaryo kaynaklanırken lütfen davaya hitap edebilir misiniz?
Eric

1

@Mat yanıtında gösterildiği gibi, komutta kullanıldığında SIGSPEC 0 değeri, komut dosyası çıktığında komutun çalışmasına trapneden olur trap.

Bu örnek ne olduğunu göstermektedir.

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

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

while [ 1 ]; do
    sleep 3
done

Bunu çalıştırdığımızda:

$ ./tr.bash 
PID: 24086

Burada süresiz olarak bekliyor. Başka bir pencerede şimdi killsinyaller gönderirsek kill -0, trapkomutta 0 sinyali listelenmiş olsa bile a'nın işlemi öldürmeyeceğini göreceksiniz .

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

Ancak killkomut dosyasını sinyal 1'i kullanarak yaparsak kill -1:

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

Betiğin çıktığını ve "selam" iletisini 2 kez yazdırdığını göreceğiz. Birincisi sinyal 1 için, ikincisi komut dosyasından çıkıldığı için.

$ ./tr.bash 
PID: 24086
hi
hi

0

0 üzerindeki tuzak kabuk çıkınca çalıştırılır. Genellikle her zaman yürütülen bir yerde tmp dosyalarını temizlemek için kullanılır:

tmp = / tmp / myscript. $$

tuzak 'rm -f $ tmp; çıkış '0 1 2 15

do_a_bunch_of_stuff

çıkış

tuzağın sonundaki çıkış temizleme işleminde doğru durumdaki kabuktan çıkar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.