2012-05-09 51 views
2

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

+1

在返回的名称,因为它没有变成是我想象的那么可靠。为什么你需要知道终端模拟器? –

+0

@FredFoo您应该取消删除答案,并将其留作历史用途。 –

回答

4

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

由于@larsmans建议,你可以检查TERM环境变量,但大多数仿真器使用同一端口设置..

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

或者,如果你有pstree简单地处理其输出:

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

(对不起,我不有X终端,所以我不能显示一个适当的例子)

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

+0

这可能不是100%可靠的,但我可以确认'getenv()'会产生终端仿真器。 – Makoto

+0

我的显示'xterm',但它只是一个SSH连接(用腻子) –

+0

@KarolyHorvath:看看我的[答](http://stackoverflow.com/a/15309583/1050454),我实现了你的方法。 –

4

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

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

正如你所说,这是终端的名称(它只是告诉你它的能力),而不是终端*模拟器*。 –

+0

有趣的是,在Windows上打印出“终端类型是哑巴”。 – imallett

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 
+1

这真的很有用,我用它来创建一个适合我的解决方案。 – Dannid

0

号楼关闭前两个答案与pstree,我创建了一个环境变量来确定终端仿真器类型在我的.bashrc,然后在我的剧本,我可以访问这些信息。

我用这个来设置我的guake tab标题使用postactivate并在postdeactivate中清除它,但我不希望在我使用不同的终端时碰巧进入virtualenvironment时调用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 
0

有功能:ctermid()和gettyname()

ctermid指定字符串

getttyname工作删除我的答案选定的文件设备

+0

这两个都不是标准C. –