Java调用Linux Here String(<<<)执行命令失败原因咨询
问题:Java ProcessBuilder执行含Here String的命令报错
在Linux终端执行cat <<< 'Hello'可以正常输出内容,但使用Java的ProcessBuilder执行以下代码时出现错误:
String cmd = "cat <<< 'Hello'"; Process p = new ProcessBuilder(cmd.split(" ")).start(); String stderr = IOUtils.toString(p.getErrorStream(), Charset.defaultCharset()); String stdout = IOUtils.toString(p.getInputStream(), Charset.defaultCharset()); System.out.println(stderr);
终端报错信息:
cat: '<<<': No such file or directory cat: "'hello'": No such file or directory
不含<<<的命令可正常执行,请问问题原因是什么?
原因分析
<<<是Bash等Shell提供的Here String语法,属于Shell的扩展功能,并非cat命令本身支持的参数。
当你直接用ProcessBuilder(cmd.split(" "))启动进程时,Java会直接调用cat可执行文件,并把<<<、'Hello'作为独立的命令行参数传递给cat。但cat只会将这些参数当作要读取的文件名,自然找不到名为<<<和'Hello'的文件,因此报错。
而在终端执行命令时,是由Shell(比如Bash)先解析命令中的Here String语法,将'Hello'作为输入传递给cat,再启动cat进程,所以能正常工作。
解决方法
方法1:通过Shell执行命令
让ProcessBuilder调用Shell来解析整个命令,比如使用bash -c:
String cmd = "cat <<< 'Hello'"; Process p = new ProcessBuilder("bash", "-c", cmd).start(); // 后续读取流的代码不变
方法2:直接向进程输入流写入数据
绕过Shell的Here String,直接通过Java向cat进程的标准输入流写入内容:
Process p = new ProcessBuilder("cat").start(); // 向进程输入流写入数据 try (OutputStream os = p.getOutputStream()) { os.write("Hello".getBytes(Charset.defaultCharset())); } // 后续读取流的代码不变
内容的提问来源于stack exchange,提问作者qarabala
相关产品推荐
相关产品推荐

