如何检查当前使用的终端仿真器?

我安装了gnome-terminal和Guake。 我想在这些终端仿真器启动时给出不同的启动消息。 我应该在.bashrc中编写什么代码才能实现?

这个function应该做的工作:

container() { pid=$$ while true; do pid=$(ps -h -o ppid -p $pid 2>/dev/null) case $(ps -h -o comm -p $pid 2>/dev/null) in (gnome-terminal) echo "Running in gnome terminal";return;; (xterm) echo "Running in xterm";return;; (rxvt) echo "Running in rxvt";return;; (python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;; esac [[ $(echo $pid) == 1 ]] && break done } container 

您可以通过grepping父进程名称来获取终端模拟器名称。 因此它适用于每个终端仿真器。

在bash,zsh等中:

 basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //') 

有鱼壳:

 basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //') 

试试这个:

 echo $TERM 

这是更权威的,但可能会被你的程序搞砸。 然而,在我看来,它说xterm和ttys它说linux ,我认为它代表Linux Console。

使用pstreeawk是最简单的方法:

 pstree -sA $$ | awk -F "---" '{ print $2 }' 

解释

  1. 显示pstree$$的进程树(原始进程)。
  2. pstree论点:

    • -s :显示进程的父进程
    • -A :以纯ASCII显示输出。
  3. awk工具扫描模式, -F参数用于拆分进程。

  4. 最后'{ print $2 }'告诉awk只输出第二个匹配模式(在本例中是终端模拟器名称)。

在许多linux系统echo $TERM返回xterm上面看stazherpost。

要使用实际终端,请执行以下操作:

1:关闭当前正在运行的每个终端实例。

2:使用常用方法打开新终端。

3:输入命令如下:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

4:回归应该是这样的:

lxterminal --geometry=135x20

这是细分:

所以: ps是“过程状态”

ps选项-o是显示与指定的空格或逗号分隔的关键字列表关联的信息。 听起来很复杂,但事实并非如此。 (空格或逗号)分隔(关键字列表)指定。

因此,(关键字列表)是'cmd='列表中只有一个关键字。 所以,只要求显示命令打开终端。

ps选项-p是“按进程ID”哇这是ps的非常好的选项。 问题是,你必须传递给ps这个进程id。 那么,如何获取进程ID? 我们打开表达式$(ps -o 'ppid=' -p $$)

在这里,我们必须开始更深入地思考。 我希望我发明了这种bash单行,但我没有。 我想我从https://wiki.archlinux.org/偷了它,我找不到了。 这些家伙很棒,但很多时候,经过多次研究,我无法理解他们的意思。 我们能做的就是现在明白它,因为我会解释。

所以我们知道$是bash中的扩展运算符。 我喜欢思考“解开”。 因此, $(foo -opt bar)将展开或展开“foo -opt bar”。 但是在bash中,单个圆形支撑(...)打开子壳。

所以, $(foo -opt bar) 在子shell中运行 “foo -opt bar”。 很奇怪,很难理解。

好了,所以现在我们再次运行几乎相同的命令, ps -o 'ppid=' -p $$但这次ps,进程状态,向我们展示了他可以在子shell实例中看到的内容。

-o列表中的关键字,只有一个关键字和以前一样,但ppid=这是直接询问父shell的进程ID 来自于DAUGHTER SHELL! 非常聪明,是吗? 当我能理解这一点时,我很兴奋!

-p再次,“按进程ID”,而在bash $$是进程ID。

如果你调用ps -o 'ppid=' -p $$ ,或者直接从第一个shell请求$$任何其他命令,他可能会说pid = 1,或来自xWindow的pid,或者你的桌面程序,或者你也许得到shell的实际pid。 如果你问多次,你每次都可能得到不同的答案!

但是,如果你召唤女儿并问她“你爸爸是谁”,她会告诉你的! 非常聪明。 我希望我能成为这样的天才来发明这种方法。

你是对的,我只是回答标题问题,而不是问题。 所以,你走了,鲍勃是你的叔叔。

在上面的一个答案中,我不确定案例开关的用途。 不需要这种shell开关。 我的〜/ .bashrc脚本实际上只是一个简单的行,所有的echo命令都只是为了好玩。 如何解释…

任何术语在开始时读取〜/ .bashrc,并执行他将在.bashrc中看到的任何命令。 因此,无论调用哪个术语,他都会读取.bashrc并执行命令,因此只有.bashrc中所需的结构才能修改或排除一个或另一个术语的行为。 期望的行为是每个术语执行相同的命令,因此不需要大小写切换。 终端自己会告诉你他是如何被召唤的,所以没有必要区别对待。

注意(1)我没有测试guake,但适用于jlliagre在第一个回答中提到的所有其他人。

注意(2)由于wiki的markdown格式化,您无法如图所示进行剪切和粘贴。 您必须删除每个反引号 ,包括删除下划线字符,并添加实际的反引号,在ps之前或-p $$)之后没有空格。

〜/ .bashrc的脚本

 # show welcome message for actual terminal in use echo "Welcome. You are attempting to use" echo "" echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_ echo "" echo "Good Luck and God Speed." 

这很有趣。 我已将此添加到我自己的〜/ .bashrc中。

如果你正在使用bash,我会这个命令会帮助你:

which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))

如果你使用的是ZSH,那么有一个更好(更快)的解决方案,它只使用ZSH内置函数并直接操作/proc/$pid/{stat,cmdline}

 get-terminal-emulator() { if [[ $TTY = "/dev/tty"* ]]; then echo "linux-console" return fi local pid=$$ name='' while true; do proc_stat=(${(@f)$(