2016-03-25 32 views
2

Harici bir programı (evtest) iki kez başlatan bir bash komut dosyası var. Üst komut sonlandırmadan Ctrl-C ile programı sonlandır

#!/bin/bash 

echo "Test buttons on keyboard 1" 
evtest /dev/input/event1 

echo "Test buttons on keyboard 2" 
evtest /dev/input/event2 

olarak bildiğim kadarıyla, evtest Ctrl-C ile sadece sona erdirilebilir. Sorun, bunun da ana komut dosyasını sonlandırmasıdır. Bu şekilde, ikinci evlenme çağrısı asla gerçekleşmeyecek.

İlk evtest komut dosyasını kapatmadan nasıl kapatabilirim, böylece ikinci evtest gerçekten çalışır?

Teşekkürler!

PS: "neden evtest çalışan el yerine bir komut dosyası kullanarak değil" sormak istiyorum biri için, cevap bu komut dosyası ayrıca yarı otomatik donanım ayıklama testi içerdiğini, nedenle başlatmak için daha uygun olur komut dosyası ve daha fazla komut çalıştırmaya gerek kalmadan her şeyi yapın.

cevap

6

trap komutunu "yakalama" sinyallerini kullanabilirsiniz; Bu, C'ye ait signal() veya sigaction() çağrılarının kabuk eşdeğeri ve sinyalleri yakalamak için diğer programlama dillerinin çoğudur. evtest yine (genellikle Ayrılma) tarafından ^C gönderdiği SIGINT sinyale göre hareket edecek, böylece

tuzak, altkabuklarda için sıfırlanır, ancak ana işlem (yani kabuk) olmaz.

Basit bir örnek:

#!/bin/sh 

# Run a command command on signal 2 (SIGINT, which is what ^C sends) 
sigint() { 
    echo "Killed subshell!" 
} 
trap sigint 2 

# Or use the no-op command for no output 
#trap : 2 

echo "Test buttons on keyboard 1" 
sleep 500 

echo "Test buttons on keyboard 2" 
sleep 500 

Ve hala bir saniye içinde iki kez ^C basarak ana programdan çıkmanız sağlayan bir varyant:

last=0 
allow_quit() { 
    [ $(date +%s) -lt $(($last + 1)) ] && exit 
    last=$(date +%s) 
} 
trap allow_quit 2 
İlgili konular