如何检查当前正在使用哪个终端模拟器?

Ved*_*als 21 command-line bashrc

我安装了 gnome-terminal 和 Guake。我想在这些终端模拟器启动时显示不同的启动消息。我应该在 .bashrc 中编写什么代码才能实现这一点?

jll*_*gre 12

这个功能应该做的工作:

container() {
    pid=$$
    while true; do
        pid=$(ps -h -o ppid -p $pid 2>/dev/null)
        case $(ps -h -o comm -p $pid 2>/dev/null) in
        (gnome-terminal) echo "Running in gnome terminal";return;;
        (xterm) echo "Running in xterm";return;;
        (rxvt) echo "Running in rxvt";return;;
        (python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;;
        esac
        [[ $(echo $pid) == 1 ]] && break
    done
}
container
Run Code Online (Sandbox Code Playgroud)


miu*_*miu 12

您可以通过搜索父进程名称来获取终端模拟器名称。因此它适用于每个终端模拟器。

在 bash、zsh 等中:

basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')
Run Code Online (Sandbox Code Playgroud)

带鱼壳:

basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')
Run Code Online (Sandbox Code Playgroud)

  • 最后; 一个有效的答案:-) (2认同)

CMC*_*kai 12

尝试这个:

echo $TERM
Run Code Online (Sandbox Code Playgroud)

这更权威,但可能会被你的程序搞砸。但是在我的上,它说xterm,在 ttys 上说linux,我认为它代表 Linux 控制台。

  • `$TERM` 是一个变量,它指的是您正在使用的终端仿真器自行报告的规范,而不是实际仿真器本身。例如,在我的系统上,即使我实际上正在运行 lxterminal,`echo $TERM` 也会返回 `xterm`。正在发生的是 lxterminal 自我报告 xterm 合规性。lxterminal 实际上并不完全兼容 xterm,所以你必须小心。规范文件通常位于`/usr/share/terminfo`。 (3认同)

sta*_*her 5

在很多linux系统上echo $TERM返回xterm请参阅上面的 stazher 帖子。

要获得实际使用的终端,请执行以下操作:

1:关闭当前正在运行的每个终端实例。

2:使用常用方法打开新终端。

3:输入命令如下:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

4:返回应该是这样的:

lxterminal --geometry=135x20

这是细分:

所以:ps是“进程状态”

ps选项-o显示与指定的空格或逗号分隔的关键字列表相关的信息。听起来很复杂,但事实并非如此。(空格或逗号)分隔(关键字列表)指定。

所以,(关键字列表)是'cmd='只是列表中的一个关键字。所以,只是要求显示打开终端的命令。

ps 选项-p是“按进程 ID” 哇,这对于 ps 来说是非常好的选项。问题是,您必须将此进程 ID 传递给 ps。那么,如何获取进程id呢?我们解开表达式 $(ps -o 'ppid=' -p $$)

在这里我们必须开始更深入地思考。我希望我发明了这个 bash 俏皮话,但我没有。我想我是从https://wiki.archlinux.org/偷来的某个地方偷来的,我再也找不到了。这些人很棒,但很多时候我无法理解他们说要做什么,直到经过大量研究之后。我们现在能做的就是理解它,因为我会解释。

所以我们知道$bash 中的扩展运算符。我喜欢思考“拆开”。因此,$(foo -opt bar)将展开或扩展“foo -opt bar”。但在 bash 中,单圆括号(...)打开子 shell。

因此,$(foo -opt bar)将“foo -opt bar”扩展为在子 shell 中运行。非常奇怪且难以理解。

好的,现在我们再次运行几乎相同的命令,ps -o 'ppid=' -p $$但是这次 ps,进程状态,向我们展示了他可以从子 shell 实例中看到的内容。

-o关键字列表,和以前一样只有一个关键字,但这ppid=是直接询问父 shell 的进程 ID!来自女儿的壳内!非常聪明,是吗?当我能理解这一点时,我非常兴奋!

-p再次强调,“按进程 ID”,在 bash 中$$是进程 ID。

如果您直接从第一个 shellps -o 'ppid=' -p $$调用 或任何其他命令,他可能会说 pid=1,或者来自 xWindow 的 pid,或者来自您的桌面程序,或者您可能会获得 shell 的实际 pid。$$如果你问很多次,你可能每次都会得到不同的答案!

但是,如果您调用女儿并问她“谁是您的爸爸”,她会告诉您!非常聪明。我希望我能像天才一样发明这种方法。