在bash脚本中,如何从使用eval命令时执行的程序获取PID?

我有一个bash脚本中的命令是类似于这样的:

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

但是,如果我做了一个ps $pid它显示了主要的脚本过程,而不是java程序的过程。

当我省略eval时,它获得了正确的过程,但为了使一些复杂的参数正确工作,我需要使用它。

任何想法如何获得Java程序的PID在eval命令中执行时?

您的&符号是eval行的背景,导致(顶级)shell分叉子级,子shell eval字符串,并依次运行您的java程序作为顶级shell的孙子。 所以, $! 报告最近使用后台命令的子shell的pid。

而是移动您的评估内的背景:

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

只要括号没有变得足够复杂就可以成为一个子shell ,以上都是可行的。