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.

MichaelTheSlav
  • 111
  • 1
  • 3
  • Possible duplicate of [How do I get the parent process ID of a given child process?](https://askubuntu.com/questions/153976/how-do-i-get-the-parent-process-id-of-a-given-child-process) – WinEunuuchs2Unix Apr 03 '18 at 10:06

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.

Daniel Imms
  • 271
  • 2
  • 10
  • 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](https://stackoverflow.com/q/69578546/12162258) 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.

WinEunuuchs2Unix
  • 99,709
  • 34
  • 237
  • 401