11

I have a script which runs whenever I open the terminal (I put the command in .bashrc). Now when I open Visual Studio Code the script is obviously also executed in the internal terminal therein. I don‘t want this to happen. Is there any way to detect whether a terminal instance was started by VSCode so I can prevent the script from executing in that case? (I use bash)

Sorry if this is a dumb question, I am still fairly new to Linux and bash.

2 Answers2

17

VS Code sets the standard environment variable TERM_PROGRAM in the terminal's environment to indicate what launched it, so you can solve your problem using this without needing to parse the process tree:

if [[ "$TERM_PROGRAM" == "vscode" ]]; then
  exit 0
fi

Rest of script...

The one exception to this rule is if an extension creates a terminal and specifies the seldom used strictEnv flag. These are shells that the extension indicated it wants complete control over the environment.

  • Vscode didn't do this automatically for me, so I went to the terminal.integrated.env.linux option in the Vscode settings and added this environment variable manually. – Liron Lavi Mar 24 '20 at 19:55
  • Possibly things have changed since your answer, but as of this writing, TERM_PROGRAM is actually not set during environment resolution, which happens when Code is started from the UI. See this question for details. – thisisrandy Oct 15 '21 at 02:54
  • It should be, sounds like you might be experiencing a bug? Please create an issue here https://github.com/Microsoft/vscode/issues/new – Daniel Imms Oct 16 '21 at 13:58
  • In my case $TERM_PROGRAM wasn't set, but $TERM was set to dumb, so I used that to detect it instead. – Thomas Ahle Sep 06 '22 at 18:38
2

Using this potentially duplicate answer: https://askubuntu.com/a/1012277/307523

rick@alien:~$ echo $$
25119
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~$ pstree -aps $$
systemd,1 splash fastboot kaslr
  └─lightdm,1026
      └─lightdm,1294 --session-child 12 19
          └─upstart,1838 --user
              └─gnome-terminal-,25109
                  └─bash,25119
                      └─pstree,5696 -aps 25119

The environment variable $$ returns the current running processes PID (Process ID) which is the bash terminal.

The pstree command shows the entire "tree" of commands called.