Как исключить $ из параметра String компоновщика процесса, чтобы выполнить команду оболочки - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь экранировать символ "$" при выполнении echo $! команда в Java.

static def execSync(String command) throws Exception {
    log.info("exec(" + command + ")")
    String[] splited = command.split("\\s+")
    def listCommand = Arrays.asList(splited)
    ProcessBuilder processBuilder = new ProcessBuilder()
    processBuilder.command(listCommand)
    return processBuilder.start()
}

execSync("echo \$!") // returns $! when i'd like a pid

Я обнаружил, что проблема заключается в команде, которая выполняется (т. Е. Код выше), а не в моем способе получить стандартный вывод команды (outputtream blabla). Если вы абсолютно уверены, что это не так, я покажу больше.

Когда я выполняю в своей системе (centOs 7) "echo $!" Я, очевидно, получаю pid, например: 2626.

Я бы в основном хотел узнать, есть ли способ сделать "echo $!" как в системе со строкой в ​​моей функции? (регулярное выражение или другие вещи)

В противном случае, ProcessBuilder.start возвращает Process, но, похоже, у него нет метода для получения pid, только exitReturn, out / in / error stream ... Так как я выполняю предыдущую команду с помощью метода, показанного выше, я могу получить pid с помощью команды linux.

Итак, есть ли способ получить pid предыдущего процесса? (не совсем то, что я ищу, но я могу справиться, если нет другого пути)

Я застрял с Java 8, когда у Java 9 есть метод "getPid"

1 Ответ

0 голосов
/ 04 июня 2019

Если вы .execute() или используете ProcessBuilder напрямую, вы не можете напрямую использовать функции оболочки. Это просто позволяет порождать процессы с аргументами. Вы должны запустить оболочку и заставить ее выполнить «скрипт» (команду) вашей оболочки. Э.Г.

def listCommand = ["/bin/sh", "-c", command]
...