首页 > 解决方案 > 如何从流程构建器字符串参数中排除 $,以执行 shell 命令

问题描述

我试图在执行 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

我已经确定问题出在执行的命令中(即:上面的代码),而不是我获取命令标准输出的方式(输出流 blabla)。如果你绝对确定不是,我会展示更多。

当我在我的系统(centOs 7)上执行“echo $!” 我显然得到了一个 pid,例如:2626。

我最想知道是否有办法做一个“回声$!” 就像在我的函数中带有字符串的系统上一样?(正则表达式或其他东西)

否则,ProcessBuilder.start 返回一个 Process 但似乎没有获取 pid 的方法,只有 exitReturn、out/in/error 流...由于我使用上面显示的方法执行了上一个命令,我虽然可以使用 linux 命令获取 pid。

那么,有没有办法获取上一个进程的pid?(不是我真正想要的,但如果没有其他办法,我可以管理)

当 java 9 有一个方法“getPid”时,我被 java 8 困住了

标签: groovycommandechopid

解决方案


如果你.execute()还是ProcessBuilder直接使用,就不能直接使用shell功能。它只允许产生带有参数的进程。您必须启动一个外壳并使其执行您的外壳“脚本”(命令)。例如

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

推荐阅读