2012-02-29 20 views
7

私はどこでも検索してきたと私はグローバル変数を持つが、以外に、私はstackoverflow.comでの第一人者のは、私を助けることができるかもしれ信じることを実行する方法はありませんことを信じるように来ている:引数を渡すことによる関数のトラップ?

があります引数を渡すことによって関数をトラップするbashの方法
たとえば、trap <function_name> <arg_1> <arg_2> SIGINT

答えて

13

trapでは任意のコマンド(または一連のコマンド)を指定できますが、そのコマンドを1つの引数として渡す必要があります。シェルはSIGINTを受信するたびに

foo bar baz | bip && fred barney ; wilma 

:たとえば、この:

trap 'foo bar baz | bip && fred barney ; wilma' SIGINT 

はこれを実行します。私はあなたを誤解してる

たぶん
trap '<function> <arg_1> <arg_2>' SIGINT 
+1

Yeap!ありがとう:] – Kounavi

+0

実際には、トラップ "myfunction $ arg_1 $ arg_2"を呼び出してから動作しませんでした。SIGINT SIGTERMは、Ctrl-Cが押されたときに$ arg_1 $ arg_2の古い値が保存され、ラッパー関数を使うか、引数をグローバルにするかどうかは、私が意図した通りにすることができないからです:/ P.S .:あなたの例のようにdouble_quotesを使用していても問題はありませんか? – Kounavi

+1

@Kounavi:あなたが推測したように、二重引用符ではなく一重引用符を使用する必要があります。 – ruakh

2

、しかし...これは合法である:あなたのケースでは、それはあなたが望むように聞こえる

trap "cp /etc/passwd $HOME/p" SIGINT 
trap 'cp /etc/passwd /tmp/p; echo wooo hoo' SIGINT 
+0

$ arg1、$ arg2などの変数を使った単一引用符のみが使用できました。しかし、それが私の必要なものです! ;) – Kounavi

+1

私はMichalがそれをとても徹底的に説明してくれてうれしく思います。 :) – rsaw

1

私は私が正しくあなたが何を意味するか理解していませんシグナルハンドラに関数を呼び出してパラメータを渡す場合は、trap "function arg1 arg2" SIGNALが動作するはずです。たとえばtrap "ls -lh /" INTの場合、シェルのCtrl + Cはls -lh /(2 argsのプログラム)が呼び出されます。

+0

実際に私は引用符を使用していないし、それは動作していませんでした。 ] – Kounavi

+0

更新:まだそれはありません(私のコメントはトップポストでチェックしてください) – Kounavi

+2

二重引用符に変更するだけで、トラップコマンドが実行されるまで拡張されます(例えば、 'trap 'echo" $ PATH "'INT'を指定すると、PATHへの変更はすべてトラップ機能から見えます。 –

関連する問題