You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动