如何检测用户打开的终端数量

man*_*m-n 10 bash virtual-terminal

我使用Ubuntu的,并且可以在手动更改bashshell提示符颜色绿使用

export PS1="\e[0;32m[\u@\h \W]\$ \e[m" 
Run Code Online (Sandbox Code Playgroud)

但是,我希望每次打开新终端或选项卡时,shell 提示颜色都会自动更改。我知道基本的 tty TERM 有 16 种颜色,如果打开的终端超过 16 个,可以旋转颜色。当我通过Putty,tmuxscreen.

我的想法是编写一个 shell 脚本并将其放置在.bashrc检测用户已打开的新终端会话中,并将全局计数器从\e[0;31m[to递增\e[0;47m[。如何检测用户打开的终端数量?

egm*_*ont 9

如果您确实需要获得已打开的终端数量,请计算您拥有的文件数量/dev/pts(尽管这可能包括由后台进程打开的文件,而不是图形终端模拟器打开的文件)。或者,计算终端仿真器的子进程数,如 Jacob 在其响应的第一行中所示。

避免依赖who的输出和寻找gnome-pty-helper进程,因为这些在较新的gnome-terminal版本中不起作用。

请注意,现在几乎所有图形终端仿真器(包括 putty)和多路复用器(screen、tmux)都支持 256 色。如果您使用此调色板,您可以获得非常漂亮的彩色提示。

我对一个非常简单的解决方案的建议是将颜色基于当前 tty 行的编号。例如,处理tty命令的输出以仅获取数字并从中导出颜色。某个 tty 行号一次只提供给一个终端,在内核重新发出相同的行号之前,您必须先关闭该终端。这与 256 种颜色相结合,自动保证您不会在给定时间看到两次相同的颜色(即使使用 16 种颜色,它也会提供相当均匀的分布)。无需维护全局计数器,无需对终端或进程进行计数。


Jac*_*ijm 5

在单个用户的情况下,如果我们以 为例xterm,我们可以简单地统计 pid 的数量xtermxterm为每个窗口创建一个单独的 pid。
gnome-terminal但是运行单个 pid,但好消息是它为每个窗口和/或选项卡创建了一个子进程。我们可以通过以下命令检索这些子进程:

pgrep -P <pid_of_gnome-terminal>
Run Code Online (Sandbox Code Playgroud)

然而,有一些并发症需要处理:

  • 阅读您的问题,我们可能会假设,在这种情况下,用户实际上是 x-session 的所有者。通常我们可以简单地使用 -$USER变量,但这可能与当前登录的用户不匹配$DISPLAY

  • 在多用户情况下,属于(任一)终端应用程序的 pid 不一定属于当前$DISPLAY. 我们只需要分离出相关的 pid 和 child-pid。

  • 在 Unity(15.10 或更低版本)上,如果第二个用户登录,则会启动一个附加进程 ( gnome-pty-helper),该进程在 中显示为子进程gnome-terminal,但该进程(显然)没有窗口或选项卡。在Mate 上,该过程无论如何都存在。

简而言之

要计算终端应用程序的选项卡和/或窗口的数量,我们需要:

  • 看看我们是否运行了一个终端应用程序,它有多个 pids一个$DISPLAY(x-session)上的单个 pid
  • 从正在运行的进程中,分离出相关的 pid,在此运行$DISPLAY
  • 如果应用程序为其 pid 运行子进程(对于窗口/选项卡),请查看是否gnome-pty-helper运行,以更正数字。

然而,这可以很好地编写脚本,以可靠地找到当前打开的窗口和/或选项卡的数量。

剧本

在下面的脚本中,目标终端应用程序用作参数。该脚本适用于我测试过的许多终端。一个例外是Tilda在这一刻。

一个例子

  • 我有两个用户登录,一个(不是当前的)有两个gnome-terminal窗口,一个(图像中的一个)有三个gnome-terminal窗口,还有两个xterm窗口。

在此处输入图片说明

命令:

/path/to/get_terms.sh gnome-terminal
Run Code Online (Sandbox Code Playgroud)

输出:

3
Run Code Online (Sandbox Code Playgroud)

尽管

/path/to/get_terms.sh xterm
Run Code Online (Sandbox Code Playgroud)

输出:

2
Run Code Online (Sandbox Code Playgroud)

剧本

pgrep -P <pid_of_gnome-terminal>
Run Code Online (Sandbox Code Playgroud)

使用