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

java:自定义变量加载到系统变量后替换shell模版并执行shell

这里的需求前提是,在项目中进行某些操作前,需要在命令后对shell配置文件的进行修改(如ip、port),这个对于用户是不友好的,需要改为用户页面输入ip、port,后台自动去操作修改配置;那么这篇博客的由来就有了。

在这里插入图片描述
上面图片是AI创作,未经允许,不可商用哦!

目录

  • 实现功能描述
  • 功能实现拆解
    • 项目加载自定义变量
      • 项目加载自定义变量文件到系统变量中
        • 自定义变量文件如下
        • java代码如下
        • 实操验证如下
      • shell通过source .env环境变量文件方式加载
        • test.env环境变量文件如下
        • shell模版文件如下
        • 实操验证如下
    • 替换shell模版并运行
      • 项目加载自定义变量文件到系统变量中
      • shell通过source .env环境变量文件方式加载

以下为实际工作简化后描述

实现功能描述

  1. 项目加载自定义变量
  2. 自定义变量替换shell模版内容
  3. 项目运行shell

功能实现拆解

针对上述功能描述,其实可以拆解为三步

  1. 实现项目加载自定义变量
  2. 实现替换shell模版内容
  3. 运行shell

项目加载自定义变量

这里有两种实现,
一种是项目加载自定义变量文件到系统变量中;
另一种是shell通过source .env环境变量方式加载。

项目加载自定义变量文件到系统变量中

这种方法的好处是项目中可以获取到自定义变量,如果项目代码需要获取自定义变量进行操作,可以考虑使用此方式

新增一个自定义变量文件(当然也可以在代码中固定写入变量直接加载到系统中,这样的缺点就是不灵活,如果有变动就需要改代码)

自定义变量文件如下

BASE_ROOT_DIR=/home
LICENSE_PATH=/home/LICENSE
PACKAGE_PATH=/home/test.tar.gz

java代码如下

    /*** 加载自定义变量文件到系统变量中* @param configFile*/public static void loadProperties(String configFile){try {FileInputStream propFile = new FileInputStream(configFile);Properties p = new Properties(System.getProperties());p.load(propFile);System.setProperties(p);} catch (Exception e) {e.printStackTrace();}}

调用loadProperties方法后,就可以通过System.getProperty("key")获取自定义的变量了
如获取BASE_ROOT_DIRSystem.getProperty("BASE_ROOT_DIR")

实操验证如下

自定义变量文件
在这里插入图片描述

测试代码

import java.io.FileInputStream;
import java.util.Properties;public class LoadProperties {public static void main(String[] args) {String configFile = "/Users/kunzhi/Downloads/learn/linuxTest/config.sh";loadProperties(configFile);System.out.println("BASE_ROOT_DIR: " + System.getProperty("BASE_ROOT_DIR"));System.out.println("LICENSE_PATH: " + System.getProperty("LICENSE_PATH"));System.out.println("PACKAGE_PATH: " + System.getProperty("PACKAGE_PATH"));}public static void loadProperties(String configFile){try {FileInputStream propFile = new FileInputStream(configFile);Properties p = new Properties(System.getProperties());p.load(propFile);System.setProperties(p);} catch (Exception e) {e.printStackTrace();}}
}

运行输出结果
在这里插入图片描述

shell通过source .env环境变量文件方式加载

这种方法的好处是在shell执行时直接获取环境变量,不需要项目代码做多余的操作

  1. 新增一个.env环境变量文件(如test.env)
  2. 当在执行的shell文件中首行加入source命令(source test.env)或者先在命令行执行命令source test.env后,执行shell文件

test.env环境变量文件如下

BASE_ROOT_DIR=/home
LICENSE_PATH=/home/LICENSE
PACKAGE_PATH=/home/test.tar.gz

shell模版文件如下

cd ${DATASYS_BASE_ROOT_DIR}
pwdecho "DATASYS_PACKAGE_PATH: ${DATASYS_PACKAGE_PATH}"
echo "PACKAGE_PATH: ${PACKAGE_PATH}"
echo "LICENSE_PATH: ${LICENSE_PATH}"

实操验证如下

创建shell模版文件 test.sh,并执行
在这里插入图片描述
创建环境变量文件 test.env,并在test.sh文件首行加入命令:source test.env
在这里插入图片描述

替换shell模版并运行

因为替换是否成功,只有通过运行结果才能有力证明,所以我们放在一起看

由于替换shell模版内容的具体操作受自定义变量加载方式影响,所以我们还是按照两种加载方式来看

项目加载自定义变量文件到系统变量中

如果是项目加载自定义变量文件到系统变量中,还需要项目获取变量并传入shell替换;

代码如下

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Properties;public class LoadProperties {public static void main(String[] args) {String configFile = "/Users/kunzhi/Downloads/learn/linuxTest/config.sh";//加载自定义环境变量loadProperties(configFile);String BASE_ROOT_DIR = System.getProperty("BASE_ROOT_DIR");String LICENSE_PATH = System.getProperty("LICENSE_PATH");String PACKAGE_PATH = System.getProperty("PACKAGE_PATH");System.out.println(BASE_ROOT_DIR + ": " + System.getProperty("BASE_ROOT_DIR"));System.out.println(LICENSE_PATH + ": " + System.getProperty("LICENSE_PATH"));System.out.println(PACKAGE_PATH + ": " + System.getProperty("PACKAGE_PATH"));//需要传入shell模版替换的内容String[] evnp = {"BASE_ROOT_DIR=" + BASE_ROOT_DIR, "LICENSE_PATH=" + LICENSE_PATH, "PACKAGE_PATH=" + PACKAGE_PATH};String shellFile = "/Users/kunzhi/Downloads/learn/linuxTest/test1.sh";//替换并运行shellreplaceAndRun(shellFile, evnp);}//加载自定义环境变量public static void loadProperties(String configFile){try {FileInputStream propFile = new FileInputStream(configFile);Properties p = new Properties(System.getProperties());p.load(propFile);System.setProperties(p);} catch (Exception e) {e.printStackTrace();}}//替换并运行shellprivate static void replaceAndRun(String path, String[] evnp) {try {Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", path}, evnp,null);//只有process.waitFor() 结果为0,才说明执行成功了if (process.waitFor() != 0) {throw new Exception(String.valueOf(process.waitFor()));}InputStreamReader ir = new InputStreamReader(process.getInputStream());LineNumberReader input = new LineNumberReader(ir);String line;//输入shell中执行的每一行while ((line = input.readLine()) != null){if (line.contains("ERROR")) {throw new Exception("ERROR");}System.out.println(line);}} catch (Exception e) {System.out.println(e);}}
}

运行结果
在这里插入图片描述

shell通过source .env环境变量文件方式加载

如果是shell通过source .env环境变量方式加载,在上一步实操演示可以看出,其实已经达到替换效果,直接执行shell文件即可了

代码如下

package test;import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Properties;/*** @author yanZhiHang* @date 2023/2/26 17:06*/
public class LoadProperties {public static void main(String[] args) {runShell(shellFile1);}private static void runShell(String path) {try {Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", path}, null,null);if (process.waitFor() != 0) {throw new Exception(String.valueOf(process.waitFor()));}InputStreamReader ir = new InputStreamReader(process.getInputStream());LineNumberReader input = new LineNumberReader(ir);String line;while ((line = input.readLine()) != null){if (line.contains("ERROR")) {throw new Exception("ERROR");}System.out.println(line);}} catch (Exception e) {System.out.println(e);}}
}

相关文章:

java:自定义变量加载到系统变量后替换shell模版并执行shell

这里的需求前提是,在项目中进行某些操作前,需要在命令后对shell配置文件的进行修改(如ip、port),这个对于用户是不友好的,需要改为用户页面输入ip、port,后台自动去操作修改配置;那么…...

Redis高级删除策略与数据淘汰

第二章:Redis高级 学习目标 目标1:能够说出redis中的数据删除策与略淘汰策略 目标2:能够说出主从复制的概念,工作流程以及场景问题及解决方案 目标3:能够说出哨兵的作用以及工作原理,以及如何启用哨兵 …...

社畜大学生的Python之pandas学习笔记,保姆入门级教学

接上期,上篇介绍了 NumPy,本篇介绍 pandas。 目录 pandas 入门pandas 的数据结构介绍基本功能汇总和计算描述统计处理缺失数据层次化索引 pandas 入门 Pandas 是基于 Numpy 构建的,让以 NumPy 为中心的应用变的更加简单。 Pandas是基于Numpy…...

20_FreeRTOS低功耗模式

目录 低功耗模式简介 STM32低功耗模式 Tickless模式详解 Tickless模式相关配置 实验源码 低功耗模式简介 很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等。 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也…...

Hive的使用方式

操作Hive可以在Shell命令行下操作,或者是使用JDBC代码的方式操作 针对命令行这种方式,其实还有两种使用 第一个是使用bin目录下的hive命令,这个是从hive一开始就支持的使用方式 后来又出现一个beeline命令,它是通过HiveServer2服…...

Flume三大核心组件

Flume的三大核心组件: Source:数据源 Channel:临时存储数据的管道 Sink:目的地 Source:数据源:通过source组件可以指定让Flume读取哪里的数据,然后将数据传递给后面的 channel Flume内置支持读…...

数据结构(六)二叉树

一、树形结构概念树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:1、有一个…...

Docker buildx 的跨平台编译

docker buildx 默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性,它能够创建多个 builder 实例,在多个节点并行地执行构建任…...

【java基础】方法重载和方法重写

文章目录方法重载方法重写方法重载 方法重载就是可以在一个类里面定义多个相同名称的方法,只需要参数列表的个数或者类型不同就行。 public class Overload {public int add(int a, int b) {return a b;}public double add(double a, double b) {return a b;}}对…...

Gradle7.4安装与基本使用

文章目录一.前言二.下载Gradle三.Gradle镜像源-全局级配置四.配置Gradle wrapper-项目级配置五.Gradle对测试的支持五.生命周期5.1 settings文件六.Gradle任务入门6.1 任务行为6.2 任务依赖方式七. Dependencies依赖引入7.1 依赖冲突及解决方案八.Gradle整合多模块SpringBoot九…...

[系统安全] 虚拟化安全之虚拟化概述

本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全、逆向分析等内容感兴趣或者想要了解一些内容,欢迎关注。本系列文章将会随着笔者在未来三年的读研过程中持续更新,由于笔者现阶段还处于初学阶段,不可避免参照复现各类书籍内容,如书籍作者认为侵权请告知,…...

如何从零开始系统的学习项目管理?

经常会有人问,项目管理到底应该学习一些什么?学习考证之后能得到什么价值? 以下我就总结一下内容 一,学习项目管理有用吗? 有效的项目管理带来的益处大致包括以下几个方面:更有效达成业务目标、满足相关…...

面试题-----

面试题---- 一.HTML 1.常用哪些浏览器进行测试,对应有哪些内核? ①IE------------------->Trident ②Chrome---------->以前是Webkit现在是Blink ③Firefox------------>Gecko ④Safari-------------->Webkit ⑤Opera--------------&…...

线材-电子线载流能力

今天来讲的是关于电子线的一个小知识,可能只做板子的工程师遇到此方面的问题会比较少,做整机的工程师则必然会遇到此方面问题,那就是线材问题。 下面主要说下电子线的过电流能力。(文末有工具下载)电子线(h…...

单变量回归问题

单变量回归问题 对于某房价问题,x为房屋大小,h即为预估房价,模型公式为: hθ(x)θ0θ1xh_{\theta}(x)\theta_{0}\theta_{1}x hθ​(x)θ0​θ1​x 要利用训练集拟合该公式(主要是计算θ0、θ1\theta_{0}、\theta_{1}θ…...

ubuntu/linux系统知识(36)linux网卡命名规则

文章目录背景命名规范系统默认命名规则优势背景 很久以前Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等,属于biosdevname 命名规范。 服务器通常有多块网卡,有板载集成的,同时也有插在PCIe插槽的。Linux系统的命名原来是et…...

java的一些冷知识

接口并没有继承Object类首先接口是一种特殊的类,理由就是将其编译后是一个class文件大家都知道java类都继承自Object,但是接口其实是并没有继承Object类的 可以自己写代码测试: 获取接口类的class对象后遍历它的methods,可以发现是不存在Obje…...

java代理模式

代理模式 为什么要学习代理模式?因为这是SpringAOP的底层! 【SpringAOP和SpingMVC}】 代理模式的分类: 静态代理 动态代理 代理就像这里的中介,帮助你去做向房东租房,你不能直接解出房东,而房东和中介…...

JUC包:CountDownLatch源码+实例讲解

1 缘起 有一次听到同事谈及AQS时,我有很多点懵, 只知道入队和出队,CLH(Craig,Landin and Hagersten)锁,并不了解AQS的应用, 同时结合之前遇到的多线程等待应用场景,发现…...

Log4j2基本使用

文章目录1. Log4j2入门2. Log4j2配置3. Log4j2异步日志4. Log4j2的性能Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来了一些重大的提升,主要有: 异常处理&#xff0c…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...