在 Java 中运行 Bash 命令

2023-12-26

我有以下课程。它允许我通过java执行命令。

public class ExecuteShellCommand {

public String executeCommand(String command) {

    StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(command);
        p.waitFor();
        BufferedReader reader = 
                        new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";           
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return output.toString();

}

}

当我运行命令时,上一个命令的结果不会保存。例如:

public static void main(String args[]) {

    ExecuteShellCommand com = new ExecuteShellCommand();
    System.out.println(com.executeCommand("ls"));
    System.out.println(com.executeCommand("cd bin"));
    System.out.println(com.executeCommand("ls"));

}

给出输出:

bin
src


bin
src

为什么第二个“ls”命令不显示“bin”目录的内容?


您开始一个新流程Runtime.exec(command)。每个进程都有一个工作目录。这通常是启动父进程的目录,但您可以更改启动进程的目录。

我建议使用流程构建器 https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

ProcessBuilder pb = new ProcessBuilder("ls");
pb.inheritIO();
pb.directory(new File("bin"));
pb.start();

如果您想在 shell 中运行多个命令,最好创建一个临时 shell 脚本并运行它。

public void executeCommands() throws IOException {

    File tempScript = createTempScript();

    try {
        ProcessBuilder pb = new ProcessBuilder("bash", tempScript.toString());
        pb.inheritIO();
        Process process = pb.start();
        process.waitFor();
    } finally {
        tempScript.delete();
    }
}

public File createTempScript() throws IOException {
    File tempScript = File.createTempFile("script", null);

    Writer streamWriter = new OutputStreamWriter(new FileOutputStream(
            tempScript));
    PrintWriter printWriter = new PrintWriter(streamWriter);

    printWriter.println("#!/bin/bash");
    printWriter.println("cd bin");
    printWriter.println("ls");

    printWriter.close();

    return tempScript;
}

当然,您也可以使用系统上的任何其他脚本。在运行时生成脚本有时是有意义的,例如如果执行的命令必须更改。但您应该首先尝试创建一个可以使用参数调用的脚本,而不是在运行时动态生成它。

如果脚本生成很复杂,那么使用像 Velocity 这样的模板引擎也可能是合理的。

EDIT

您还应该考虑将流程构建器的复杂性隐藏在简单的界面后面。

将您需要的内容(接口)与其完成方式(实现)分开。

public interface FileUtils {
    public String[] listFiles(String dirpath);
}

然后,您可以提供使用进程构建器或本机方法来完成工作的实现,并且可以为不同的环境(如 Linux 或 Windows)提供不同的实现。

最后,这样的接口也更容易在单元测试中模拟。

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

在 Java 中运行 Bash 命令 的相关文章

  • n 个素数之和 java,困惑

    我读过几篇关于这方面的文章 我什至在一次考试中这样做过 但是是在 vb net 中 它工作得很好 但是当我尝试执行我的程序时 Eclipse 只是不停地运行 否则它会给我错误的答案 这是我的第四次尝试 我需要将前 n 个素数相加 因此我检查
  • spring依赖注入会创建单例对象吗?

    spring内部是如何管理这些对象的呢 单例对象什么时候创建和销毁 默认情况下 Spring bean 基本上是单例的 Spring 将为每个类创建一个实例 并且通常会在 Spring 初始化时执行此操作 然而 这几乎是无限可定制的 Spr
  • 在jodatime中计算一个月的周数

    jodatime 可以计算一个月的周数吗 我需要这样的东西 月份 七月 第 27 年的一周 1 7 七月 第 28 年的一周 9 14 七月 第 29 年的一周 16 21 七月 第 30 年的一周 23 31 七月 月份 八月 第 31
  • 使用 applescript 在空间中打开应用程序

    我正在尝试创建一个脚本 该脚本将在特定的 空间 中打开应用程序 假设我在空间 1 的终端中工作 然后我希望能够在空间 4 中打开 safari 有没有办法做到这一点 我做了一些搜索 只找到了设置系统配置文件选项的方法 也许我应该告诉你我的最
  • java中应用程序的CPU核心数和线程数之间有什么关系?

    我是java新手多线程编程 我想到的问题是 根据我的数量 我可以运行多少个线程CPU核心数 如果我运行的线程超过CPU核心数机器运行应用程序会产生开销吗 例如 当我们有一台服务器计算机 其中有一个运行 2 个线程 主线程 开发人员线程 的服
  • 用 Maven 解决 jar 地狱问题?

    我正在使用两个 jars A 和 B B 是一个库 A 的类使用库 B 中的一些旧类 现在 当我将这两个 jars 包含在我的项目类路径中时 这给我带来了一个问题 因为它们的名称相同两个班级 但其中一个班级比另一个班级年长 并且行为方式不同
  • java中接口上的抽象方法是什么[重复]

    这个问题在这里已经有答案了 可能的重复 为什么要将 Java 接口方法声明为抽象方法 https stackoverflow com questions 641536 why would one declare a java interfa
  • Android 上为什么会出现线程泄漏?

    我在 Android 应用程序中注意到 每次退出主屏幕时 堆大小 泄漏 都会增加 ByteArrayOutputStream 的量 我能做到的最好的办法就是添加 this mByteArrayOutputStream null 在 的最后r
  • Hibernate 过滤器仅在从数据库加载数据后应用吗?

    我在网上发现了一些相互矛盾的信息 有谁知道Hibernate过滤器是否影响生成的sql 或者只是过滤从数据库读取的数据 休眠过滤器影响 where 子句生成的 SQL The Hibernate 过滤器简介 http java dzone
  • Java 8 元空间垃圾收集

    我正在运行的 java 进程在运行的第一个小时左右始终表现良好 然而 性能会迅速下降 在分析时 我发现元空间垃圾收集相当频繁地发生 直到小时标记 然后失去控制 我相当确定我能够使用 XX MaxMetaspaceSize 选项来解决此问题
  • 使用Optional进行空检查

    我想使用可选实用程序在 JDK8 中执行空检查 这是我正在编写的代码 它给了我一个错误 java util Optional stringToUse java util Optional of childPage getContentRes
  • 远程数据库的“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障”

    我尝试连接到远程 MySQL 数据库 但失败并收到此错误 com mysql jdbc exceptions jdbc4 CommunicationsException Communications link failure 困惑的是 当我
  • bash 脚本中自动 docker 登录

    我如何提交我的凭据docker login脚本中的命令 我使用的 bash 脚本基本上自动化了设置自定义虚拟机等的整个过程 但是当我需要在脚本中登录 docker 来提取映像时 我收到以下错误 用户名 FATA 0000 设备的 ioctl
  • 在 OpenCV 中将 `BufferedImage` 转换为 `Mat`

    我怎样才能转换BufferedImage to a Mat in OpenCV 我正在使用 JAVA 包装器OpenCV not JavaCV 由于我是新手OpenCV我在理解如何做时遇到一些问题Mat works 我想做这样的事情 基于
  • Java 错误:默认构造函数未定义隐式超级构造函数

    我有一些简单的 Java 代码 其结构与此类似 abstract public class BaseClass String someString public BaseClass String someString this someSt
  • 使用华为 E8372 hilink 通过 bash 脚本发送短信

    我正在尝试从华为 E8372 发送短信 与该产品的旧版本不同 它现在需要登录 用户名 密码 才能允许进行 API 调用 从https github com arska e3372 issues 1 https github com arsk
  • 设置环境变量(密码),其值不会保存到 bash 历史记录中

    当我以 root 身份登录 MySQL 时 我通常设置 MROOTPASS 环境变量 export MROOTPASS my secret password 然后做 mysql u root p MROOTPASS 这消除了每次我以root
  • 我可以在Java中设置枚举起始值吗?

    我使用枚举来创建一些常量 enum ids OPEN CLOSE OPEN 值为零 但我希望它为 100 这可能吗 Java 枚举与 C 或 C 枚举不同 后者实际上只是整数的标签 Java 枚举的实现更像是类 它们甚至可以有多个属性 pu
  • 如何更改 Java 中不同类的变量?

    如何更改 Java 中不同类的变量 我正在尝试更改另一个类中的变量 然后在第一个类中使用它 我在 First 类中创建了一个变量 并将其值设置为 1 然后我尝试在 Second 类中将同一变量的值更改为 2 但是当我在 First 类中使用
  • Java 8 哈希映射无法正常工作

    自 java 8 以来 我们面临着 HashMap 行为方式的奇怪问题 当HashMap的键实现了Comparable接口 但compareTo的实现与equals不一致时 HashMaps 长得比它们应该长的大得多 它们包含多个相同元素的

随机推荐

  • R 根据前一行中的值删除行

    我是 R 新手 尝试根据前一行的值删除行 样本数据 Cust ID Date Value 500219 2016 04 11 12 00 00 0 500219 2016 04 12 16 00 00 0 500219 2016 04 14
  • /usr/bin/sudo 必须由 uid 0 拥有并设置了 setuid 位版本 .ubantu14.04 LTS

    当我为 npm 设置 EACCESS 并在终端中运行 chown 命令以更改所有者权限时 但现在我陷入了困境 sudo usr bin sudo 必须由 uid 0 拥有并设置了 setuid 位 我的版本是 ubuntu14 04 LTS
  • 将查询的所有结果放入 Prolog 中的列表中

    我想知道如何创建一个谓词 将从某个查询中获得的所有结果 因此我得到一个结果并按分号 直到得到 False 放入列表中 例如 如果我写foo X 1 2 3 在一些 Prolog 监听器中 假设结果是 X 11 X 22 False 我想将所
  • 覆盖css文件中的定义

    我有一个 css 文件 它定义了所有样式 tags 像这样 p 我怎样才能写一个在包含具有默认样式的样式表的页面中 没有简单的方法可以做到这一点 不过 有一些常见的技巧可以模拟这种行为 最好使用的方法取决于被覆盖区域的复杂程度以及您想要执行
  • 适用于 GAE 的 Weasyprint Dockerfile

    我正在尝试在 gae 上安装 weasyprint 我知道我们可以通过将运行时从 python 更改为 app yaml 中的自定义来将其传递到 Dockerfile 中来安装外部库 我在为 weasyprint 库创建 Dockerfil
  • Flink:是否有另一种方法来计算平均值和状态变量而不是使用 RichAggregateFunction?

    我不确定必须使用哪个流 Flink 转换来计算某个流的平均值并在 5 秒的窗口内更新状态 假设它是我的状态的整数数组 如果我使用RichFlatMapFunction我可以计算平均值并更新我的数组状态 但是 我必须打电话 streamSou
  • 如何修复“无法识别的 Guid 格式”

    如果我单击以下文件类型 我在 VS 2013 中不断收到此错误 cs cshtml config asax html 我最近刚刚更新到 Visual Studio 2013 Update 2 并修复了兼容性问题以始终运行 devenv ex
  • 如何使用 Meteor 更新插入

    让我的 Meteor upsert 功能正常工作时遇到了一些问题 我相当新 200 行代码 并且遇到了一些麻烦 该集合不断插入额外的行 而不仅仅是更新 我花了过去 30 分钟谷歌搜索 但找不到任何我能理解的例子 这是我的代码 Values
  • 在 Python 中创建菜单 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 python 制作一个菜单 需要 打印带有编号选项的菜单 让用户输入编号选项 根据用户选择的选项号 运行特定于该操作的函数 现在
  • 为什么 rspec 没有获取我的规范/支持文件?

    我有一个奇怪的错误 我的spec support文件夹中有一个utilities rb文件来保存一些辅助功能 例如登录方法 规范 支持 utilities rb include ApplicationHelper def sign in u
  • Django REST Framework - 在序列化器测试中设置请求?

    我构建了一个 Web 应用程序 其中后端是使用 Django REST Framework 实现的 现在我正在编写单元测试 并且在测试序列化器方法时遇到了问题 这是我正在努力解决的序列化器方法的一个示例 def get can edit s
  • 学习 Java 编程最重要的事情是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对面向对象编程有很好的理解 但我已经有一段时间没有编程了 我想再学一遍 Java 编程的哪些最重要的方面是必须学习的 这样我才能将自己定位为一
  • jdk/jmods中的jmods目录在应用程序运行时有什么作用吗?

    我有一个使用 OpenJDK 在沙箱环境中运行的应用程序 JDK目录中有一个jmods文件夹 关于 jmods 的文档不是很好 据我了解 如果我想使用 JLink 创建另一个自定义 JRE jmods 很有用 假设我不想这样做 只想拥有一个
  • 负载测试苹果推送通知服务器应用程序

    我开发了一个服务器应用程序 可以将推送消息发送到苹果服务器 我已经用几个设备对其进行了测试 并且能够在设备上获取消息 问题是 当我的数据库中有大约一百万台设备时 我无法知道我的应用程序将如何执行 在这种情况下有没有办法对您的服务器应用程序进
  • WMD Markdown 编辑器 - HTML 到 Markdown 的转换

    我在用wmd http wmd editor com 在做一个项目的markdown编辑器时 有一个问题 当我发布包含 markdown 文本区域的表单时 它 如预期 将 html 发布到服务器 但是 假设服务器端验证失败 我需要将用户发送
  • 为什么 Array#each 返回具有相同元素的数组?

    我正在学习如何做的细节each在 ruby 中工作 我尝试了以下代码行 p 1 2 3 4 5 each element el 结果是一个数组 1 2 3 4 5 为什么返回值是each相同的数组 没有each只是提供一种迭代方法 或者这只
  • 使用 Doctrine 2 强制编码和解码

    我正在与遗产一起工作大泥球 http en wikipedia org wiki Big ball of mud使用一个latin1数据库但适用于utf8字符串 每次应用程序读取或写入数据库时 它都会进行解码或编码by hand和商店utf
  • 在 NHibernate 中使用 Enterprise Library 日志记录应用程序块

    我们正在尝试将 NHibernate 集成为我们的 OR M 但是 我们目前正在使用 Enterprise Library 的日志记录应用程序块 我知道NHibernate使用log4net来记录日志 有谁有关于如何使用 Enterpris
  • ASMX Web 服务 - “此 Web 服务使用 http://tempuri.org/ 作为其默认命名空间。”消息 - 但不应该是这样

    我已经使用 Visual Studio 创建了一个 Web 服务 2005 年 我知道我很守旧 一切都编译得很好 但当它打开时 我收到警告 此 Web 服务不符合 WS I Basic Profile v1 1 而且 该网络服务正在使用ht
  • 在 Java 中运行 Bash 命令

    我有以下课程 它允许我通过java执行命令 public class ExecuteShellCommand public String executeCommand String command StringBuffer output n