You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:54:16