在退出 java 启动的命令行命令或 shell 脚本之前提取进程环境

Posted

技术标签:

【中文标题】在退出 java 启动的命令行命令或 shell 脚本之前提取进程环境【英文标题】:Extract process environment before exit from java-initiated command line command or shell script 【发布时间】:2015-07-24 20:08:25 【问题描述】:

我想读取/转储从 java 内部启动的进程(.sh 文件、命令行调用等)的环境变量。

例如,我有一个运行并设置环境变量的 shell 脚本:

#!/bin/bash
export blah='really boring'

我从父 java 程序调用那个 shell 脚本,但是在 shell 脚本退出之前,我想从它的环境中提取 $blah 的值。除了返回代码和 stdout/stderr 流之外,这将允许我将信息传回调用 java 程序。

我想我可以将 env 转储到一个文件中,然后再读取该文件,但我需要专门修改脚本才能做到这一点,涉及文件系统,这似乎很麻烦。

通过阅读 POSIX 退出的各种文档,我可以在进程上放置 on_exit 钩子,但我想知道是否有一种方法可以使用相当纯的 java 来做到这一点。 JNR 可以帮忙吗?

任何其他想法都会很棒,越跨平台越好,例如将调用的命令/shell 封装在更多 UNIXy 的优点或标准 groovy/java 进程启动库之外的其他库中。

【问题讨论】:

这对 Process 的内部结构及其在基本 JDK 中的工作方式有很多很好的了解:blog.headius.com/2013/06/the-pain-of-broken-subprocess.html 【参考方案1】:

你可以让你的脚本更长一点来转储环境变量。

runtime.exec("bash", "-c", ". your-script.sh ; export > export.dump");

【讨论】:

嗯,不错。不能包装任意命令,但可用于单个 shell 脚本......仍然需要文件 i/o,但这可能是可以容忍的。 printenv 也适用于许多平台。你的脚本.sh ; printenv > env.dump @ConstanceEustace 您可以将导出转储到 stdout 或 stderr 并用 Java 读取。或者您可以将其写入tmpfs / ram 驱动器。

以上是关于在退出 java 启动的命令行命令或 shell 脚本之前提取进程环境的主要内容,如果未能解决你的问题,请参考以下文章

shell命令行和在DOS窗口中输入命令有啥区别吗

shell 备忘

命令行通过执行shell脚本启动java类,命令行“卡住”or“挂起”or“停顿”,不能输入新的命令了,怎么办

Vim编辑器与Shell命令脚本

vim中执行shell命令

Linux Bash-脚本基础