我有一个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 ,以上都是可行的。