在 shell 脚本中获取终端模拟器名称

cof*_*Mug 3 linux terminal-emulator terminal shell-script processes

我曾经使用pstree类似于以下内容的内容来查找运行 shell 脚本的父模拟器的名称:

pstree -s $PPID | awk -F '---' '{print $6}'

这适用于我当前的系统。我测试过mate-terminalxterm但不确定这是否适用于其他 Linux 系统/平台和其他终端。有没有更好/更整洁(更便携)的方法来实现这一目标?

Sté*_*las 7

ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"
Run Code Online (Sandbox Code Playgroud)

可能会给你带来好的结果。它给出了作为会话领导者的父进程的名称。对于在终端模拟器中启动的进程,这通常是运行该终端模拟器的进程(除非正在使用screen, expect, tmux... 之类的东西(但请注意,screentmux 终端模拟器),或者使用setsid, start-stop-daemon..显式启动新会话。 .)

如果您发现嵌套括号难以阅读,您可以将其写成几行:

ps -o comm= -p "$((
                  $(
                    ps -o ppid= -p "$((
                                      $(
                                        ps -o sid= -p "$$"
                                      )
                                    ))"
                  )
                ))"
Run Code Online (Sandbox Code Playgroud)

或者使用变量(这也有助于使脚本更易于解释):

sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")
Run Code Online (Sandbox Code Playgroud)

您还可以尝试解析wtmp终端模拟器通常在哪里记录一个条目,其 pid 与伪终端设备相关联。这适用于我在 Debian 系统上提供的 expect/screen/tmux... 不涉及:

ps -o comm= -p "$(
  dump-utmp -r /var/log/wtmp |
  awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
    $2 == tty {print $5;exit}')"
Run Code Online (Sandbox Code Playgroud)

(使用dump-utmp来自 GNU acct)。