Windows下Java ProcessBuilder在Git Bash中传递带引号参数的问题
解决Windows下Java调用Git Bash传递带引号参数的问题
在Git Bash中执行以下命令可正常运行:
./script.sh -s "run:3-20-1-10000;10000;" mq
但在Windows环境下用Java调用Git Bash执行该命令时,两种尝试均失败:
失败尝试1:拆分参数构建ProcessBuilder
String[] cmd = {"C:\\Program Files\\Git\\bin\\bash.exe", "-c" , "./script.sh"}; ProcessBuilder pb = new ProcessBuilder(cmd); pb.cmd.add("-s"); pb.cmd.add("\"run:3-20-1-10000;10000;\""); pb.cmd.add("mq"); File newDir = new File("C:\\..\\"); pb.directory(newDir); Process p=pb.start();
无报错但无预期结果,原因是-c参数要求后面跟完整的命令字符串,而这里./script.sh被当作-c的唯一参数,后续的-s、带引号的参数和mq会被当成bash自身的参数,而非传递给script.sh。
失败尝试2:整段命令作为-c参数
String[] cmd = {"C:\\Program Files\\Git\\bin\\bash.exe", "-c", "./script.sh -s \"run:3-20-1-10000;10000;\" mq"}; ProcessBuilder pb = new ProcessBuilder(cmd); Process p = pb.inheritIO().start();
出现错误:
unknown option 10000: command not found mq: command not found
原因是Java字符串中的转义双引号传递给bash后,被错误解析导致引号丢失,分号;被bash识别为命令分隔符,进而把10000和mq当作独立命令执行。
正确解决方案
方案1:用单引号包裹带特殊字符的参数
在bash中,单引号会完全保留内部内容,不会解析分号等特殊字符,适合传递包含分号的参数:
// 替换为实际的Git Bash路径和脚本目录 String bashPath = "C:\\Program Files\\Git\\bin\\bash.exe"; File scriptDir = new File("C:\\path\\to\\your\\script\\directory"); // 用单引号包裹带分号的参数,避免bash解析分号 String command = "./script.sh -s 'run:3-20-1-10000;10000;' mq"; ProcessBuilder pb = new ProcessBuilder(bashPath, "-c", command); pb.directory(scriptDir); Process p = pb.inheritIO().start(); // 等待进程执行完成 p.waitFor();
方案2:转义双引号(适用于必须用双引号的场景)
如果需要使用双引号,需在Java字符串中对双引号进行双重转义(Java用\\表示bash中的\),确保bash能正确识别引号:
String bashPath = "C:\\Program Files\\Git\\bin\\bash.exe"; File scriptDir = new File("C:\\path\\to\\your\\script\\directory"); // Java中用\\转义,bash最终收到的是\"包裹的参数 String command = "./script.sh -s \\\"run:3-20-1-10000;10000;\\\" mq"; ProcessBuilder pb = new ProcessBuilder(bashPath, "-c", command); pb.directory(scriptDir); Process p = pb.inheritIO().start(); p.waitFor();
内容的提问来源于stack exchange,提问作者user1207289
相关产品推荐
相关产品推荐

