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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:55:18