我正在寻找如何使用C编程语言(GNU/Linux)获取终端模拟器(«aterm»,«xterm»,«konsole»等)的名称。我做了几项研究,但我没有找到任何东西。获取终端名称
获取终端名称
回答
我怀疑有一个可靠的方法来检查这一点。
由于@larsmans建议,你可以检查TERM
环境变量,但大多数仿真器使用同一端口设置..
我会检查父进程ID(getppid
)及其父(linux: programmatically get parent pid of another process?)等直到你找到看起来像终端仿真程序的名称的进程......
或者,如果你有pstree
简单地处理其输出:
# pstree -As 12652
init---screen---bash---pstree
(对不起,我不有X终端,所以我不能显示一个适当的例子)
无论如何,这些都不是完全可靠,但可能会工作。
这可能不是100%可靠的,但我可以确认'getenv()'会产生终端仿真器。 – Makoto
我的显示'xterm',但它只是一个SSH连接(用腻子) –
@KarolyHorvath:看看我的[答](http://stackoverflow.com/a/15309583/1050454),我实现了你的方法。 –
终端的名称由TERM
环境变量给出。
char *termtype = getenv("TERM");
printf("The terminal type is %s\n", termtype);
正如你所说,这是终端的名称(它只是告诉你它的能力),而不是终端*模拟器*。 –
有趣的是,在Windows上打印出“终端类型是哑巴”。 – imallett
看看是否有效。我从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
这真的很有用,我用它来创建一个适合我的解决方案。 – Dannid
号楼关闭前两个答案与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
有功能:ctermid()和gettyname()
ctermid指定字符串
getttyname工作删除我的答案选定的文件设备
这两个都不是标准C. –
- 1. emacsclient:无法获取终端名称
- 2. 获取伪终端的主端口名称
- 3. 获取应用程序名称/标签或终端
- 4. 如何从JavaScript获取终端服务客户机名称?
- 5. 终端服务:以管理员身份运行时获取客户端名称
- 6. 如何获取端口名称列表?
- 7. 获取客户端计算机名称
- 8. Rails获取客户端的名称
- 9. 获取服务名称的端口号?
- 10. 获取终端宽度Haskell
- 11. 如何从C终端的Unix终端获取输入文件名?
- 12. 按名称获取
- 13. 获取的名称
- 14. 按名称获取
- 15. 按名称获取
- 16. 从demangled名称获取错位名称
- 17. 获取类名称函数的名称
- 18. 在linux终端中获取光标位置和终端大小
- 19. 串行端口名称不能在终端和喜好系统
- 20. 告诉伪终端的从属端口名称
- 21. 最终字段名称的获取方法
- 22. [RabbitMQ] [Spring]如何获取最终交换名称?
- 23. 获取视频或图片的最终名称
- 24. 如何使用名称空间端点获取azure队列名称?
- 25. 如何在WPF中获取打印机的名称和端口名称?
- 26. ASP .NET - 在Windows Server 2003(终端服务)上获取用户名?
- 27. 在终端中的未知名称作为用户名
- 28. 从终端服务器会话中获取客户端名称的首选方法
- 29. BCEL - 获取类名称,元素名称和方法名称
- 30. 使用.net获取名称表,名称列,名称数据
在返回的名称,因为它没有变成是我想象的那么可靠。为什么你需要知道终端模拟器? –
@FredFoo您应该取消删除答案,并将其留作历史用途。 –