2012-02-29 21 views
7

我一直在到處尋找,我開始相信,有沒有辦法做到這一點除了具有全局變量,但我相信大師在stackoverflow.com也許能夠幫助我:通過傳遞參數來捕獲函數?

有任何方式在bash中通過傳遞參數來捕獲函數?
例如,trap <function_name> <arg_1> <arg_2> SIGINT

回答

13

trap可讓您指定任意命令(或命令序列),但必須將該命令作爲單個參數傳遞。例如,這樣的:每當接收外殼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 2012-02-29 19:00:30

+0

事實上,自從調用陷阱​​「myfunction $ arg_1 $ arg_2」以來,它並沒有工作。SIGINT SIGTERM意味着當按Ctrl-C時,$ arg_1 $ arg_2的舊值被保存,而不是更新的值。猜猜我會使用一個包裝函數或使參數爲全局的,因爲我不能按照我的意圖來實現這個工作:/ P.S .:重要的是,我使用double_quotes而不是像你的例子那樣使用單個函數嗎? – Kounavi 2012-02-29 21:50:38

+1

@Kounavi:正如你猜測的那樣 - 你需要使用單引號,而不是雙引號。 – ruakh 2012-02-29 22:10:34

2

也許我誤解你,但是......這是合法的:

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

只有單引號可以處理類型爲$ arg1,$ arg2等的變量。但是,這是我需要的! ;) – Kounavi 2012-03-01 12:35:55

+1

我很高興米哈爾解釋得非常徹底,你知道它解決了。 :) – rsaw 2012-03-01 20:37:43

1

我不知道我正確你的意思理解,但是如果你想讓一個信號處理函數調用一個函數並傳遞參數,trap "function arg1 arg2" SIGNAL應該可以工作。例如,trap "ls -lh /" INT將導致shell中的Ctrl + C導致調用ls -lh /(帶有2個參數的程序)。

+0

其實我沒有使用引號,它不工作。感謝您的幫助:] – Kounavi 2012-02-29 18:59:30

+0

更新:仍然沒有(檢查我的意見在頂端帖子) – Kounavi 2012-02-29 21:53:11

+2

只需將雙重更改爲單引號和擴展將被延遲,直到陷阱命令執行,例如與'陷阱'回聲「 $ PATH「'INT'對陷阱函數可以看到PATH的任何改變。 – 2012-02-29 22:00:27