2016-12-16 9 views
3

私はいくつかのトラップを管理するスクリプトを開発しています。初めに私はこのコードでINTとSIGTSTPを管理し、それは非常にうまく機能:Bashトラップ、キャプチャして同じ関数の引数として渡す

#!/bin/bash 
function capture_traps() { 
    echo -e "\nDoing something on exit" 
    exit 1 
} 

trap capture_traps INT 
trap capture_traps SIGTSTP 
read -p "Script do its stuff here and we use read for the example we pause for time to generate trap event" 
exit 0 

その後、私はSIGINTとSIGHUPある私が管理する新しいトラップを、追加しようとしました。最初のインスタンスでは、私は(作業している)これをしなかった:

#!/bin/bash 
function capture_traps() { 
    echo -e "\nDoing something on exit" 
    exit 1 
} 

trap capture_traps INT 
trap capture_traps SIGTSTP 
trap capture_traps SIGINT 
trap capture_traps SIGHUP 
read -p "Script do its stuff here and we use read for the example we pause for time to generate trap event" 
exit 0 

はその後、私はトラップによって出口で異なるものを行うことを決めたと私はそれぞれに対して異なる機能を作成する必要はありません。私はbashにおいて、for item in [email protected]; do命名法を使って関数の引数をループすることができるので、試しましたが、トラップの種類を区別しようとしていないようです。私は動作していないこのコードを作った。

#!/bin/bash 
function capture_traps() { 

    for item in [email protected]; do 
     case ${item} in 
      INT|SIGTSTP) 
       echo -e "\nDoing something on exit" 
      ;; 
      SIGINT|SIGHUP) 
       echo -e "\nDoing another thing even more awesome" 
      ;; 
     esac 
    done 
    exit 1 
} 

trap capture_traps INT SIGTSTP SIGINT SIGHUP 
read -p "Script do its stuff here and we use read for the example we pause for time to generate trap event" 
exit 0 

ヘルプがありますか? ...そこにすべてのトラップに一つだけの機能を使用して、私のコードを改善する方法でなければなりませんが、私は方法がわからない

答えて

2
あなたのトラップハンドラに引数を渡すことができ

:上記において

#!/bin/bash 
function capture_traps() { 

    #for item in [email protected]; do 
    case "$1" in 
     INT|SIGTSTP) 
      echo -e "\nDoing something on exit" 
     ;; 
     SIGINT|SIGHUP) 
      echo -e "\nDoing another thing even more awesome" 
     ;; 
    esac 
    #done 
    exit 1 
} 

for f in INT SIGTSTP SIGINT SIGHUP ; do 
    trap "capture_traps $f" "$f" 
done 

read -p "Script do its stuff here and we use read for the example we pause for time to generate trap event" 
exit 0 

コード(cygwinでテスト済み、bash 4.3.46)、capture_trapsは1つのパラメータ、すなわちトラップの名前をとります。つまり、$1capture_trapsです。一度に1つのトラップしか取得できないので、ループは必要ありません。それは

です:最初の引数は関数名よりも一般的なことができ、あなたがしたい各トラップをループの繰り返し処理をトラップを設定する( INT SIGTSTP ...)と

trap "capture_traps $f" "$f" 

を実行するには

シェルは、信号または他のイベント当たり

を受信するたびにシェルコード...読み出されて実行されます0。したがって、コマンドcapture_traps $f(トラップ名が代入されている)は、特定のトラップ(第2引数、"$f")で実行されます。 Here's another answerおよびstill another

関連する問題