java - 使用 java 程序在 linux 终端中运行命令?

标签 java linux

我想使用 Java 程序在 linux 终端中将 unset DISPLAY 作为命令运行。

我尝试使用 Runtime.getRuntime().exec("unset DISPLAY");,但它不起作用。

我可以在这里做什么?

最佳答案

这行不通,原因如下。环境变量是从父进程继承的。 child 无法控制 parent 的环境。以下是您的设置中发生的情况:

 bash   ->   java   ->   unset
   |           |           |
 parent      child     grand-child
   |           |           |
unaffected unaffected   affected

所以实际上你的命令是有效的,但它没有达到你想要的效果。遗憾的是,Java 无法更改父环境。

您的 java 程序可以修改它自己的环境变量,并且由 java 生成的任何子级都将继承这些变量。因此,您可以让 java 为您启动一个 bash shell,然后以交互方式使用该 bash shell,但这看起来开销很大。

有关如何设置 java 的环境变量,请参阅此帖子:
How do I set environment variables from Java?

如果您愿意回避整个 java 问题,大多数人在这种情况下所做的就是获取一个特殊文件。例如,创建一个名为“no-x.sh”的文件,如下所示:

# Unset the display variable
unset DISPLAY

然后从您当前的(交互式)shell 中获取文件,如下所示:

$> source no-x.sh

现在您的主 bash shell 已经改变了它的环境。请注意,这是一个 HACK(或者对于你们所有的 bash 狂热者来说——一个功能),您永远不应该期望用其他任何东西(比如 java)来复制这个功能。

关于java - 使用 java 程序在 linux 终端中运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420265/

相关文章:

java - @KafkaListener 不使用消息 - 反序列化问题

java - 从第三方 Wiki 页面获取信息

java - 尝试在空对象引用上调用虚拟方法 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)'

c - 所以 setsockopt 用于 AF_UNIX (AF_LOCAL) 套接字超时...未记录/不起作用...选项/替代方案?

java - 使用长字符串

java - 为什么我的鼠标事件坐标返回错误的值?

linux - 一个单词一个单词地搜索整行

php - 如何在 Linux 中使用 xampp 指向根目录中的文件?

c++ - linux new 后无变化

linux - Shellscript逐行复制文件到新文件并每50行添加一行