Bash:如何判断终端是否被第三方应用打开

Pap*_*Bag 10 bash gnome-terminal bashrc

我希望我的 bash 脚本(特别是我的~/.bashrc. 我如何确定是什么情况?有一个变量吗?提前致谢。

Mar*_*ith 11

您可能可以通过返回 shell 的祖先并确定它是由等同于“您”的东西还是其他程序启动来实现的。

获取 shell 的 PID(进程 ID),并从中获取它的 PPID(父进程 ID)。继续向上,直到你找到一些告诉你它来自哪里的东西。您可能需要在您的系统上进行试验——至少,我不知道它是否会通用。

例如,在我的系统上,获取 shell 的 PID 并用于ps显示它是bash

$ echo $$
18852
$ ps --pid 18852
  PID TTY          TIME CMD
18852 pts/1    00:00:00 bash
Run Code Online (Sandbox Code Playgroud)

获取 18852 的 PPID:

$ ps -o ppid= -p 18852
18842
Run Code Online (Sandbox Code Playgroud)

找出 PPID (18842) 是什么:

$ ps --pid 18842
  PID TTY          TIME CMD
18842 ?        00:00:02 gnome-terminal
Run Code Online (Sandbox Code Playgroud)

我们可以看到它是gnome-terminal,即终端模拟器/终端窗口。如果其他程序启动的 shell 没有在终端仿真器窗口中运行,那么这对您来说已经足够了。

如果还不够好,再上一层:

$ ps -o ppid= -p 18842
 2313
$ ps --pid 2313
  PID TTY          TIME CMD
 2313 ?        00:00:00 init
Run Code Online (Sandbox Code Playgroud)

这告诉我们gnome-terminal是由init. 我怀疑你的 shell 由另一个程序启动,那里会有不同的东西。

  • “这告诉我们 gnome-terminal 是由 init 启动的”我发现 init 不太可能启动终端窗口。相反,无论什么启动 gnome-terminal 都死了,并且 gnome-terminal 重新成为 init 的父级。检查 gnome-terminal ,它似乎是双叉。所以当它执行时,它首先fork自己并杀死原来的进程,在新的进程中继续。 (9认同)

Ser*_*nyy 10

就 Visual Studio Code 而言,显然有一种方法可以为集成终端设置额外的环境变量。因此,设置 Visual Studio 以使用此配置:

"terminal.integrated.env.linux": {
  "visual_studio": "true"
}
Run Code Online (Sandbox Code Playgroud)

并且在~/.bashrc

if [ -n "$visual_studio" ]; then
    # do something for Visual Studio
else
    # do something else for other types of terminal
fi
Run Code Online (Sandbox Code Playgroud)

通常,您可以依赖于提供给bash流程的环境。例如,$TERM变量,并运行一个类似的if..then...else...fi分支[ "$TERM" = "xterm" ]或别的东西。在个案的基础上,您可以通过env在每个控制台中运行来调查环境中的差异,将其保存到文件中env > output_console1.txt,以及在评论中甜点的diff output_console1.txt output_console2.txt建议。