我正在寻找如何使用C编程语言(GNU / Linux)获取终端仿真器(«aterm»,«xterm»,«konsole»等)的名称。我做过几次研究,但我没有找到任何东西。
答案 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一个不同的终端程序。
这是我的代码:
<。> .bashrcexport 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适用于所选的文件设备