2010-12-02 35 views
13

我有一個bash腳本,與此類似命令:在bash腳本中,如何從使用eval命令時執行的程序獲取PID?

eval "(java -classpath ./ $classname ${arguments[@]} $redirection_options $file)" & 
pid=$! 

但是,如果我做了ps $pid它顯示了主要的腳本程序,而不是Java程序的過程。

當我省略eval時它獲得了正確的過程,但爲了讓一些複雜的參數正常工作,我需要使用它。

任何想法,如何獲得Java程序的PID在eval命令中執行時?

+0

不是`!$`得到最後一條命令的命令行嗎? – khachik 2010-12-02 20:59:14

+0

我在我的描述中輸入錯誤。它應該是$! – Milo 2010-12-02 21:08:53

回答

28

您的&符號背景爲eval行,導致(頂級)shell將一個子項,子shell和eval字符串相關聯,並依次運行您的java程序作爲頂層shell的孫子。因此,$!報告了子shell的pid,這是最近使用的後臺命令。

移動而不是你的EVAL內backgrounding:

​​

只要括號沒有得到足夠複雜,成爲子shell,上面會工作。