Linux环境下Java调用Runtime.exec执行bash命令失败
解决Java Runtime.exec执行bash -c命令的语法错误问题
问题原因
当你在Java中使用Runtime.getRuntime().exec("bash -c \"npm -v\"")时,Java的命令解析逻辑和Linux Shell完全不同:
- Java会直接按空白字符拆分整个命令字符串,不会识别Shell的引号语法。
- 这导致原本期望传递给
-c的完整命令npm -v被拆成了"npm和-v"两个独立部分,bash收到的-c参数不完整,因此抛出引号不匹配的语法错误。
正确解决方案
使用exec的字符串数组重载方法,直接明确每个命令参数,不需要任何引号转义:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class RunACommandTest { public static void main(String[] args) { try { // 用数组传递参数,每个元素对应一个命令行参数 Process exec = Runtime.getRuntime().exec(new String[]{"bash", "-c", "npm -v"}); new BufferedReader(new InputStreamReader(exec.getInputStream(), StandardCharsets.UTF_8)) .lines() .forEachOrdered(line -> System.out.println("IN " + line)); new BufferedReader(new InputStreamReader(exec.getErrorStream(), StandardCharsets.UTF_8)) .lines() .forEachOrdered(line -> System.out.println("ERR " + line)); } catch(IOException e) { throw new RuntimeException(e); } } }
为什么单引号也没用?
你尝试用单引号替代双引号的写法(比如bash -c 'npm -v'),本质上和双引号的问题一致:Java依然会按空格拆分字符串,把'npm和-v'当成独立参数传递给bash,导致-c的命令内容不完整,同样触发语法错误。
内容的提问来源于stack exchange,提问作者Oliver Stahl
相关产品推荐
相关产品推荐

