为什么我的 Java 代码执行 bash 命令不正确?

2024-05-04

我试图让我的 Java 程序与 Linux bash 交互,但出了问题。我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方。执行中

echo 5 | ./prog

从 bash 本身打印正确答案25 in stdout但运行

import java.io.*;

public class Main {
    public static void main(String[] args) throws InterruptedException, IOException {
        Runtime run = Runtime.getRuntime();
        Process proc = run.exec("echo 5 | ./prog");
        proc.waitFor();
        BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        while(br.ready())
            System.out.println(br.readLine());
    }
}

出乎意料地给出5 | ./prog。解决办法是什么?


Java exec无法运行这样的 shell 命令。如果要运行 shell 命令,则需要显式调用 shell;例如

Process proc = run.exec(new String[]{"/bin/sh", "-c", "echo 5 | ./prog"});

有关 Java 对此做什么的更多详细信息,请阅读 javadocsexec(String) http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29 and exec(String[]) http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%5B%5D%29。请注意,这些是“便捷方法”,您需要遵循底层方法的链接链才能完整理解 javadoc 的内容。

如果您想了解有关 Java 如何处理此问题的更多详细信息,请参阅源代码...

如果你想深入了解Java为什么doesn't处理 shell 语法本身,您可能需要深入研究 UNIX/Linux 系统的体系结构和原理,以及应用程序、操作系统和命令 shell 之间的关注点分离。请注意,有无数不同的shell,每个都有(可能)不同的引用、参数分割、重定向、管道等规则。大多数流行的 shell 都是相似的,但这就是事情的发展方式。

解决方案说明:

  • 手动分割命令的原因是exec(String)不会将命令拆分为单个命令和参数正确。不可以。这是一个例子,其中有two管道中的命令。

  • 使用“sh”的原因是……嗯……你need用于解析和处理 shell 命令行的 shell。爪哇的exec命令不支持 shell 语法...正如 javadoc 所解释的那样。

  • “-c”选项的用途由“man sh”解释。基本上,sh -c "a b c"意思是“使用‘sh’运行命令行‘a b c’”。

FWIW,在技术上可以仅用 Java 构建和运行管道(即不依赖外部 shell),但通常不值得付出努力。您已经通过运行外部命令引入了平台依赖性,因此特定 shell 命令和语法形式的额外依赖性不会使情况变得更糟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 Java 代码执行 bash 命令不正确? 的相关文章

随机推荐

  • Pandas 滚动 std 会产生不一致的结果并且与 value.std 不同

    使用 pandas v1 0 1 和 numpy 1 18 1 我想计算时间序列上不同窗口大小的滚动平均值和标准差 在我正在处理的数据中 某些后续点的值可以是恒定的 这样 根据窗口大小 滚动平均值可能等于窗口中的所有值 并且相应的 std
  • Tensorflow:从 TFRecords 文件中提取图像和标签

    我有一个 TFRecords 文件 其中包含图像及其标签 名称 大小等 我的目标是将标签和图像提取为 numpy 数组 我执行以下操作来加载文件 def extract fn data record features Extract fea
  • 在多分支管道中授予复制 artIfact 权限

    我有以下设置 通过配置的 Jenkins 多分支管道作业Jenkinsfile 成功签出和构建后 工件将被存档 并触发下游作业来部署生成的工件 为了让第二个工作能够通过 class CopyArtifact 步骤 它需要复制权限 所以问题是
  • 如何在AWS中将AMI从爱尔兰区域复制到中国区域

    我在 AWS 爱尔兰区域有一个设置 现在我希望在中国使用该 AMI 有谁知道完成任务的最佳实践是什么 任何帮助将不胜感激 提前致谢 中国地区目前不支持 AMI 复制 根据AWS 将 AMI 从美国传输或复制到中国 北京 https foru
  • Django 删除确认视图显示变量名称而不是信息

    谁能帮我解决以下场景 我有 3 张桌子 如下所示 1和2是我的数据表 并且 3 与 1 和 2 保持关系 1 Qa table ID QA 1 qa1 2 qa2 3 qa3 a field of my Qa model tags sele
  • 如何覆盖/更新当前由 IIS 提供服务的文件?

    问题 我的公司每月发布一份时事通讯 我将其托管在我们的内部网站上 我有一个供时事通讯作者上传最新版本的页面 作者上传最新的新闻通讯后 他会发送一封广播电子邮件来宣布新的新闻通讯 员工总是会检查新的时事通讯并向作者发送反馈以及需要进行的更正
  • 如何将大型 XML 字符串插入 Oracle 表中?

    我想将一个大的 XML 字符串插入到我的表中 我的表是 test id xml column XMLType 当我插入值时 它返回 字符串文字太长 错误 我上网查了一下 大家都说把数据类型改成CLOB 但我想存储相同的数据类型 XMLTyp
  • 如何确保参数仅指向静态存储期间的对象?

    我想确保赋予函数的参数指向 或引用 一个对象 该对象具有静态存储时间 class 该解决方案需要与 C 11 一起使用 而无需编译器特定的扩展 我在研究过程中发现的最相似的问题是仅限于C语言的一种 https stackoverflow c
  • 世界CF。服务通用方法

    如何在 wcf 服务中使用通用方法 我写了这段代码 OperationContract void AddItem
  • 什么是 scanf("%*s") 和 scanf("%*d") 格式标识符?

    格式的实际用途是什么 在 scanf 中 如果这种格式存在 那么它背后一定有某种目的 下面的程序给出了奇怪的输出 include
  • 同步迭代 javascript 对象

    我有一个像这样的对象 let myObject db1 db1 file1Id db1 file2Id db 1file3Id db2 db2 file1Id db2 file2Id 我遍历这个对象并在每次迭代中 我连接到数据库 检索文件
  • jcop是在java卡中安装小程序的唯一方法吗?

    我正在尝试理解java卡的概念 我有一些疑问 我想与大家分享 也许你会对我有任何最好的建议 Jcop 我在某处读到 Java Card OpenPlatform JCOP 是由 IBM Z rich Research Laboratory
  • java运算符“->”的含义[重复]

    这个问题在这里已经有答案了 下面的代码取自 SpringBoot 应用程序的初始化 java 运算符 gt 的含义是什么 Bean public EmbeddedServletContainerCustomizer containerCus
  • 在 hibernate JPA 的 getReference() 之后,如果不使用 setter 发出 select 则无法更新

    我有以下方法 Transactional public void savethis EntityObject t entityManagerTreasury getReference EntityObject class 1 t setAc
  • webapp 在 iOS 7 中无法正确缩放

    有人遇到同样的问题吗 content width device width 当我的 iphone 仍然是 i0S 6 并且我刚刚更新到 iOS 7 并且似乎不再工作时它就可以工作 或者可能是其他原因导致了问题 有人有什么想法吗 现在我正在使
  • GSON 没有为接口类型调用我的 TypeAdapter

    GSON 似乎在使用某种技巧 它查看 JavaBean 的内部字段 而不是使用可公开访问的属性信息 不幸的是 这对我们来说不会成功 因为我们神奇地创造的豆子充满了我不希望它存储的私人领域 Test public void testJson
  • numpy.ndarray 对象不被垃圾回收

    在尝试微调某些 C C 函数的 Python 绑定中的一些内存泄漏时 我发现了一些与 Numpy 数组的垃圾收集相关的奇怪行为 为了更好地解释这种行为 我创建了几个简化的案例 该代码是使用memory profiler 其输出紧随其后 当涉
  • 将声音添加到标记数组 - 谷歌地图 javascript

    我是新来的 所以我知道我没有任何可信度 我是一名艺术家 对编程很陌生 所以我理解是否没有人会承担这个任务 我发布这篇文章是因为这是一个简单的问题 S 这是创建多个标记的代码 主要来自谷歌开发者网站 它工作正常并为每个标记创建一个自定义图标
  • 是否可以强制 html canvas 标签显示子项?

    基本上和我问的一模一样 我希望以下工作能够发挥作用
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i