2010-12-02 14 views
13

Ben buna benzer bir bash komut dosyası komutları vardır:Bir bash komut dosyasında, eval komutunu kullanırken yürütülen bir programdan PID nasıl edinilir?

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

Ben ana senaryo sürecini yerine java programının sürecini gösteren bir ps $pid yapmak Ancak eğer.

Değerlendirmeyi çıkardığımda doğru işlemi alır, ancak karmaşık argümanlardan bazılarının düzgün çalışması için onu kullanmam gerekir.

Bir eval komutunda yürütüldüğünde Java programının PID'sini nasıl alabileceğime dair bir fikriniz var mı?

+0

Son komutun komut satırını "!" Değil mi? – khachik

+0

Açıklamamda yanlış yazdım. $ Olmalıydı! – Milo

cevap

28

Sizin ve işareti, (üst düzey) kabuğun bir çocuğa, çocuk kabuğu eval dizesine ve dolayısıyla java programınızı üst düzey kabuğun torunu olarak çalıştırmasına neden olan satırının arka planını oluşturuyor. Yani, $!, en son arkaplanlanan komut olan alt kabuğun pidini bildirir.

Bunun yerine eval içindeki bir arkaplan taşıyın:

eval "(java ...) &" 
pid=$! 

sürece parantez bir altkabuk olmaya yeterli karmaşık almaz, yukarıda çalışacaktır.

+1

Evet, işte bu :) 'EXPR =" java -jar test.jar & "; değerlendirme $ EXPR; echo $! ' –

+0

FYI yapmalı: Bu çalışmayı bir terminalden fark ettim, ancak masaüstünde bir simge içeren bir senaryonuz varsa, işe yaramıyor. –