WSL2环境下如何判断终端是否由IntelliJ启动以避免自动启动tmux
WSL2环境下如何判断终端是否由IntelliJ启动以避免自动启动tmux
我最近遇到个头疼的问题:在WSL2(版本2.1.5.0)的zsh环境里,我希望tmux只在普通Windows终端自动启动,而IntelliJ IDEA 2021.3.3 Ultimate Edition调用的终端里别启动它。但因为IntelliJ是Windows进程,WSL2里查不到相关的Java进程,之前在普通Linux上用的方法完全失效了。
之前在普通Linux上的可行方案(WSL2里无效)
之前在常规Linux机器上,我会在.zshrc里加这段判断逻辑:
if ps -p $PPID | grep -iq java; then # IntelliJ终端下的配置 else # 普通终端下的配置(比如启动tmux) fi
但在WSL2里,不管是普通终端还是IntelliJ的终端,ps -p $PPID的输出完全一样,而且ps aux里根本看不到任何Java进程——毕竟IntelliJ是Windows侧的进程,WSL2的Linux环境感知不到它的存在。
我试过的两种绕路方法(都有问题)
1. 配置WSLENV传递TERMINAL_EMULATOR变量
我知道IntelliJ启动shell时会把TERMINAL_EMULATOR环境变量设为JetBrains-JediTerm,但我这个版本在WSL2里默认不传递这个变量。于是我在Windows设置里更新了WSLENV,把TERMINAL_EMULATOR加了进去。
- 结果:虽然能在IntelliJ的终端里读到这个变量的值,但它变成了系统全局变量——我新开的任何普通终端也会带上这个变量,等于没法区分两种终端了。
2. 修改IntelliJ的Shell路径传递自定义变量
我还尝试在IntelliJ的Tools>Terminal设置里修改Shell路径,想直接给zsh传递一个标记变量:
比如写:
wsl.exe --distribution Ubuntu-22.04 zsh -c "isIntellij=true zsh"
- 奇怪的是,换成bash的话(
wsl.exe --distribution Ubuntu-22.04 bash -c "isIntelliJ=true bash")是完全管用的,但zsh就是不行。我还试了各种变体:zsh -c "export isIntellij=true; zsh"bash -c "export isIntellij=true; zsh"- 给zsh加上
-i交互模式参数
结果都一样,zsh里就是读不到这个isIntellij变量。
现在我实在没思路了,有没有什么我没尝试过的方法能解决这个问题?另外要说明的是,我没法升级IntelliJ(用的是永久 fallback 许可证)。
备注:内容来源于stack exchange,提问作者Aserre




