获取终端的名称

时间:2012-05-09 16:07:16

标签: c terminal

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

5 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

无论如何,这些都不是完全可靠的,但可能会有效。

答案 1 :(得分:4)

终端的名称由TERM环境变量提供。

char *termtype = getenv("TERM");
printf("The terminal type is %s\n", termtype);

答案 2 :(得分: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

答案 3 :(得分:0)

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

我使用它将我的guake tab标题设置为当前虚拟环境使用postactivate并在postdeactivate中清除它,但如果我碰巧在我使用时进入虚拟环境,我不想要调用guake一个不同的终端程序。

这是我的代码:

<。> .bashrc

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

在postdeactivate或postactivate中(替换&#34; Terminal&#34;使用所需的标签名称)

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

if [ "$TERM_TYPE" == "guake" ]; then
  guake -r Terminal
fi

答案 4 :(得分:0)

有些功能:ctermid()和gettyname()

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

getttyname适用于所选的文件设备