当前位置: 首页 > news >正文

java调用shell

Java 可以通过 Runtime 类或 ProcessBuilder 类来调用 shell 脚本或命令。这两种方式都可以用来在 Java 应用中执行系统命令,并获取命令的执行结果或返回值。

1. 使用 Runtime.exec() 调用 shell

Runtime 类提供了 exec() 方法,可以用来执行 shell 命令或脚本:

import java.io.BufferedReader;
import java.io.InputStreamReader;public class ShellExample {public static void main(String[] args) {try {// 创建 Runtime 对象Runtime runtime = Runtime.getRuntime();// 执行 shell 命令或脚本Process process = runtime.exec("sh /path/to/script.sh");  // 或 "ls -l" 等命令// 获取命令的输出流BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 等待命令执行完毕并获取返回值int exitCode = process.waitFor();System.out.println("Exit code: " + exitCode);} catch (Exception e) {e.printStackTrace();}}
}
注意
  • "sh /path/to/script.sh" 可替换为任意 shell 命令。
  • process.waitFor() 会阻塞当前线程,直到命令执行完成,并返回退出码。通常,返回值 0 表示执行成功。

2. 使用 ProcessBuilder 调用 shell

ProcessBuilder 提供了更灵活的 API,可以设置工作目录、环境变量等信息。一般推荐使用 ProcessBuilder,尤其在涉及多个参数或更复杂的 shell 命令时。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;public class ShellExampleWithProcessBuilder {public static void main(String[] args) {try {// 创建 ProcessBuilder 对象,传入命令和参数ProcessBuilder processBuilder = new ProcessBuilder("sh", "-c", "ls -l /path/to/directory");// 设置工作目录(可选)processBuilder.directory(new java.io.File("/path/to/working/directory"));// 启动进程Process process = processBuilder.start();// 获取命令输出BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 获取错误输出BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));while ((line = errorReader.readLine()) != null) {System.err.println(line);}// 等待命令执行完成并获取退出状态int exitCode = process.waitFor();System.out.println("Exit code: " + exitCode);} catch (Exception e) {e.printStackTrace();}}
}

区别和选择

  • Runtime.exec() 适合简单命令的快速执行。
  • ProcessBuilder 更灵活,支持设置工作目录、环境变量等,适合复杂的 shell 调用场景。

注意事项

  • 使用 sh -c 作为 ProcessBuilder 的第一个参数,以便兼容更复杂的 shell 命令。
  • 如果命令带有空格或特殊字符,可以将命令分割为 ProcessBuilder 的多个参数(如 new ProcessBuilder("sh", "-c", "ls", "-l"))。

http://www.mrgr.cn/news/70368.html

相关文章:

  • springcloud alibaba之shcedulerx实现分布式锁
  • AI绘画实现自主编辑!flux新模型fill的使用与操作方法
  • 每日一练:【优先算法】双指针之快乐数(medium)
  • 为什么我们需要DDD?DDD领域驱动设计入门及案例讲解(图文并茂+浅显易懂)
  • 洛谷P8834
  • 深度学习实战人脸识别
  • BGP线路的优势和使用场景有哪些?
  • 两个链表求并集、交集、差集
  • 第21节 arkts 如何读取普通文件
  • wsl2更换字体|解决nvim图标无法显示问题
  • 群晖WebDAV结合内网穿透轻松实现思源笔记跨网络同步
  • Forest-HTTP客户端框架学习笔记
  • 2024年下半年网络规划设计师案例分析真题
  • 傲基股份上市首日股价跌超10%:仍依赖亚马逊,收入未恢复到2021年
  • 【IC每日一题:SVA和覆盖率知识点】
  • HTB:Photobomb[WriteUP]
  • 【安全测试】sqlmap工具(sql注入)学习
  • 【微服务】Docker 容器化
  • 【go从零单排】WaitGroup
  • FBX福币交易所 “马斯克概念股”爆发! 特斯拉涨4%,DXYZ涨28%
  • Django SSE 高并发分析与解决
  • docker安装jdk8
  • Android Framework 框架层主要功能类的基本介绍
  • 周报8<自学>
  • 第1章 初识Kubernetes
  • 记录学习react的一些内容