20

我在 bash 脚本中有与此类似的命令:

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

但是,如果我这样做,ps $pid它会显示主脚本进程而不是 java 程序的进程。

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

知道如何在 eval 命令中执行 java 程序的 PID 吗?

4

1 回答 1

36

您的 & 号是该eval行的背景,导致(顶级)shell 派生一个子,子 shell 到eval字符串,然后将您的 java 程序作为顶级 shell 的孙子运行。因此,$!报告子 shell 的 pid,这是最近的后台命令。

而是在 eval 中移动背景:

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

只要括号没有变得复杂到成为subshel​​l,上面的方法就可以了。

于 2010-12-02T21:17:24.747 回答