Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我在 bash 脚本中有与此类似的命令:
eval "( java -classpath ./ $classname ${arguments[@]} $redirection_options $file )" & pid=$!
但是,如果我这样做,ps $pid它会显示主脚本进程而不是 java 程序的进程。
ps $pid
当我省略 eval 时,它会获得正确的过程,但为了让一些复杂的参数正常工作,我需要使用它。
知道如何在 eval 命令中执行 java 程序的 PID 吗?
您的 & 号是该eval行的背景,导致(顶级)shell 派生一个子,子 shell 到eval字符串,然后将您的 java 程序作为顶级 shell 的孙子运行。因此,$!报告子 shell 的 pid,这是最近的后台命令。
eval
$!
而是在 eval 中移动背景:
eval "(java ...) &" pid=$!
只要括号没有变得复杂到成为subshell,上面的方法就可以了。