3

我正在寻找如何使用 C 编程语言 (GNU/Linux) 获取终端仿真器的名称(《aterm》、《xterm》、《konsole》等)。我做了几项研究,但我没有找到任何东西。

4

5 回答 5

4

我怀疑是否有可靠的方法来检查这一点。

正如@larsmans 建议的那样,您可以检查TERMenv 变量,但大多数模拟器使用相同的终端设置..

我会检查父进程 id ( getppid) 及其父进程 ( linux: programmatically get parent pid of another process? ) 等等,直到你找到一个名称看起来像终端模拟器的进程......

或者,如果您pstree只是处理其输出:

# pstree -As 12652
init---screen---bash---pstree

(对不起,我没有 X 终端,所以我无法展示一个合适的例子)

无论如何,这些都不是完全可靠的,但可能会起作用。

于 2012-05-09T16:22:56.460 回答
4

终端的名称由TERM环境变量给出。

char *termtype = getenv("TERM");
printf("The terminal type is %s\n", termtype);
于 2012-05-09T16:25:25.777 回答
1

看看这是否有效。我从 Emacs 以及 urxvt、xterm 和 rxvt 中对其进行了测试。

#!/bin/zsh

terminal_emulator_parents=`pstree -As $$`
tep_list=`echo $terminal_emulator_parents | tr -s "-" | tr "-" " " \
          | tac -s' ' | tr '\n' ' '`

found="false"
for process in `echo $tep_list`; do
    if [[ $process =~ ("urxvt"|"xterm"|"rxvt") ]]; then # here: add all
        found="true"                                    # terminal emulators
        break                                           # you can think of
    fi
done

if [[ $found == "true" ]]; then
    echo "Terminal emulator: $process"
else
    echo "Couldn't determine the terminal emulator."
fi
于 2013-03-09T10:17:04.593 回答
0

使用pstree建立前两个答案,我创建了一个环境变量来识别 .bashrc 中的终端仿真器类型,然后在我的脚本中,我可以访问该信息。

我使用它来使用 postactivate 将我的 guake 选项卡标题设置为当前虚拟环境并在 postdeactivate 中清除它,但是如果我在使用不同的终端程序时碰巧进入虚拟环境,我不希望调用 guake。

这是我的代码:

在 .bashrc

export TERM_TYPE=`pstree -As $$ | awk -F "---" '{print $2}'`

在 postdeactivate 或 postactivate 中(将“终端”替换为所需的选项卡名称)

#!/bin/bash
# This hook is run after every virtualenv is deactivated.

if [ "$TERM_TYPE" == "guake" ]; then
  guake -r Terminal
fi
于 2014-06-05T21:02:45.390 回答
0

有函数:ctermid() 和 gettyname()

ctermid 返回指定字符串中的名称

getttyname 适用于选定的文件设备

于 2015-12-05T18:20:00.507 回答