记录一个Jetbrains家族的IDE的Terminal环境变量问题

问题描述

在JetBrains家族的IDE的Terminal中,定义环境变量A的时候,无法引用环境变量B,否则会导致打开Terminal的时候环境变量失效,比如:

FOO = C:\bin
PATH = %FOO%;%PATH%

打开终端之后,PATH环境变量会彻底无效,并不能展开系统原来的PATH环境变量并在其前面添加C:\bin

问题追踪

咱也是做软件的,想来想去这个功能实现也不复杂,打开终端之前,取得所有环境变量,双重遍历 一遍,找到环境变量定义的串(Windows下是%A%这样的,Linux下是$A这样的),进行展开和替换,然后再set到终端中就可以了。为啥就不行呢?

查了很多资料,最终在Jetbrains的官方社区到到了一个令人绝望的答案:这不支持。我很震惊。

初始贴子位置:

https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003476440-Terminal-Environment-Variables-can-t-reference-other-Environment-Variables

还有一篇相关引用:

Terminal Environment Variables can't reference other Environment Variables – IDEs Support (IntelliJ Platform) | JetBrains

原来很多年以前就有人提出这个问题了,到现在为止Jetbrains也仍然不支持。

计划

Jetbrains家族的IDE,是商业软件,一般来说商业软件都应该是做的挺不错的,像这种便捷易用的功能,即使实现难度略微有一点大,那也应该是支持的才对,为啥这么多年了仍然支持不了呢?

我准备事后开发一个命令行脚本,用于解决这个问题,具体实现思路先想一下做成这样:开发一个命令行脚本,里面实现读取所有环境变量,在其实判断%A%这样的,遇到了就展开这个环境变量,最终都处理完了之后,设置回环境变量中去。然后在操作系统的全局配置终端的Profile,每次打开终端时展开这些环境变量,这样就能实现在环境变量设置的时候,A引用B了。

这么做有一个巨大的好处,比如我定义一个%JAVA_HOME%现在指向JDK8,其他地方全部使用%JAVA_HOME%这个环境变量,赶明儿我要换JDK11了,我只需要改一个%JAVA_HOME%就行了,而不必在所有配置了JDK路径的地方都改一遍。

思考

为什么计划开发一个终端命令行中的脚本来解决这个问题而不是一个可执行程序?因为可执行程序被运行,它是另外一个进程空间,它的环境变量展开要带回父进程空间中,那是另外一个问题了,会使得问题的复杂度上升,而终端命令行脚本执行完之后,相关信息会保留下来。

你可能感兴趣的:(ide)