Внутри bash script, как получить PID из программы, выполняемой при использовании команды eval?

У меня есть команды в bash script, которые похожи на следующие:

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

Однако, если я делаю a ps $pid, он показывает основной процесс script вместо процесса java-программы.

Он получает правильный процесс, когда я опускаю eval, но для правильной работы некоторых из сложных аргументов мне нужно его использовать.

Любая идея о том, как я могу получить PID программы java, когда она выполняется в команде eval?

Ответы

Ответ 1

Ваш амперсанд ссылается на строку eval, заставляя оболочку (верхнего уровня) разветвлять дочерний элемент, дочернюю оболочку на eval строку и, в свою очередь, запускать вашу Java-программу в качестве внука верхнего уровня оболочка. Таким образом, $! сообщает pid дочерней оболочки, которая является последней командой с фоном.

Вместо этого переместите фоном внутри своего eval:

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

Пока скобка не становится достаточно сложной, чтобы стать подоболочкой, это будет работать.