我正在寻找如何使用 C 编程语言 (GNU/Linux) 获取终端仿真器的名称(《aterm》、《xterm》、《konsole》等)。我做了几项研究,但我没有找到任何东西。
5 回答
我怀疑是否有可靠的方法来检查这一点。
正如@larsmans 建议的那样,您可以检查TERM
env 变量,但大多数模拟器使用相同的终端设置..
我会检查父进程 id ( getppid
) 及其父进程 ( linux: programmatically get parent pid of another process? ) 等等,直到你找到一个名称看起来像终端模拟器的进程......
或者,如果您pstree
只是处理其输出:
# pstree -As 12652
init---screen---bash---pstree
(对不起,我没有 X 终端,所以我无法展示一个合适的例子)
无论如何,这些都不是完全可靠的,但可能会起作用。
终端的名称由TERM
环境变量给出。
char *termtype = getenv("TERM");
printf("The terminal type is %s\n", termtype);
看看这是否有效。我从 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
使用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
有函数:ctermid() 和 gettyname()
ctermid 返回指定字符串中的名称
getttyname 适用于选定的文件设备