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

Mil*_*ilo 14 unix bash pid eval process

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

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

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

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

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

pil*_*row 30

你的&符号是eval行的背景,导致(顶级)shell分叉子,子shell到eval字符串,然后作为顶级shell的孙子运行你的java程序.因此,$!报告子shell的pid,这是最近的后台命令.

而是在你的eval中移动背景:

eval "(java ...) &"
pid=$!
Run Code Online (Sandbox Code Playgroud)

只要括号不够复杂到成为子壳,上面就可以了.