2016-03-25 29 views
2

外部プログラム(evtest)を2回起動するbashスクリプトがあります。親スクリプトを終了せずにCtrl-Cでプログラムを終了

#!/bin/bash 

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

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

私が知る限り、evtestはCtrl-Cでのみ終了できます。問題は、これも親スクリプトを終了させることです。そうすれば、evtestへの2番目の呼び出しは決して起こりません。

evtestを閉じるにはどうすればいいですか?2番目のevtestは実際に実行されますか?

ありがとうございます!

PS:「なぜスクリプトを使用する代わりに手動でevtestを実行しないのですか?」という質問に対して、このスクリプトには半自動化されたハードウェアデバッグテストが含まれているため、スクリプトを実行し、さらにコマンドを実行する必要はありません。

答えて

6

trapコマンドを使用して、信号をトラップすることができます。これはC言語でのsignal()またはsigaction()呼び出しと同等のシェルであり、他のほとんどのプログラミング言語はシグナルをキャッチします。

トラップはサブシェルでリセットされるため、evtest^Cによって送信された信号(通常は終了します)でも引き続き動作しますが、親プロセス(シェルスクリプト)は動作しません。

簡単な例:

#!/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 

そして、まだあなたは第二に二度^Cを押して、メインプログラムを終了することができますバリアント:

last=0 
allow_quit() { 
    [ $(date +%s) -lt $(($last + 1)) ] && exit 
    last=$(date +%s) 
} 
trap allow_quit 2 
関連する問題