Linux 确定';主机';脚本会话(例如Tilda或xTerm)?

Linux 确定';主机';脚本会话(例如Tilda或xTerm)?,linux,shell,terminal,Linux,Shell,Terminal,我想知道哪个终端软件正在托管/拥有一个bashshell会话 要求脚本shell的父级具有不可变的引用或指示符。目前,建议使用以下方法: $ command=$(ps -p $PPID -o comm --no-headers) $ echo $command tilda # $ ./example.bash bash 当我将该配方放入脚本中时,如example.bash(如上所示),结果是“bash”,而不是“tilda”。我期待的结果决不能以那种方式改变

我想知道哪个终端软件正在托管/拥有一个bashshell会话

要求脚本shell的父级具有不可变的引用或指示符。目前,建议使用以下方法:

   $ command=$(ps -p $PPID -o comm --no-headers)
   $ echo $command
   tilda
   #
   $ ./example.bash
   bash
当我将该配方放入脚本中时,如
example.bash
(如上所示),结果是“
bash
”,而不是“
tilda
”。我期待的结果决不能以那种方式改变

在这一点上,我相信我需要bashrc或.profile中的一些东西来导出START\u术语,如果还没有定义的话;这样,如果脚本由以下人员触发:

   $ myprogram &
   # starts a script like example.bash, above
   # --> command=$(ps -p $PPID -o comm --no-headers)
   # --> echo $command
   #  output should be program that created the shell process:
   #
   myprogram
我最初询问“终端管理器”的原因是,这类程序通常是最常见和最容易识别的用例。显然,这也是人们认为他们的需求/用例适合其他人的情况之一

我给出了环境变量的例子,例如在Ubuntu下,我们可能会看到:

TERM=xterm
SHELL=/bin/bash
 :
USER=will
导出
-ed.。这是明确的了解程度。所以$PPID是个好主意,如果不是这样的话,每次脚本启动时,它都会发生变化

我相信(现在)
export
-在
.profile
中使用环境变量是一个很好的解决方案。如果有一个通用的(非定制的)方法,我将把这个问题留待讨论

  • 旁白:在进程树上行走(例如)并不能保证在“顶部”停止,而“顶部”只能在第一个不是“$SHELL”的程序停止(例如),那么当bash脚本调用kornshell时又如何呢

  • 环境变量可能没有帮助的另一个方面是,Java所有者显示为“Java”,而不是程序的JAR文件。至少以后要考虑一些事情。
我使用Tilda下拉终端:

我有一些有用的脚本,就像我猜的每个人一样。我在:
.bashrc
脚本中寻找一种在启动时识别“终端”类型/软管的方法

我在谷歌(谁都知道)上运气不好,在这里的stackoverflow——很难相信这个问题还没有得到回答/询问

我做了一个实验。查看不同“终端”(软)仿真器/终端程序的
env
变量:

  • 使用基本命令:

      $  env > tmp/bash-Terminal.txt
      $  env > tmp/bash-Tilda.txt
      $  env > tmp/bash-Terminator.txt
    
    并在3对可能的配对之间进行了一些
    diff
    比较;e、 g

    例如,将终端与Tilda进行比较,发现它们“全部”都是
    XTERM
    ,还有一些细微的差异,如
    显示
    导出:

      DISPLAY=:0 
      # or 
      DISPLAY=:0.0
    
    没什么。我确实喜欢终止符选项,让我粘贴一个终端号,当然这也不能确定“xTerm”是-a:终止符shell,嗯

    我现在的处境是,我没有注意到或看到任何“内置”的东西来说明正在使用什么终端模拟器。下一步


    就是在启动过程中,以某种方式“标记”会话。真是一个奇怪的谜。欢迎评论和想法…

    您可以查找shell的父PID并查看相应的命令名

    在bash中,变量
    $PPID
    是父进程的PID。我们可以获得如下命令名:

    command=$(ps -p $PPID -o comm --no-headers)
    
    gnome终端下运行时,我看到:

    $ echo $command
    gnome-terminal-
    
    在XTerm下:

    $ echo $command
    xterm
    

    这似乎足以满足您的需要。

    可能的副本实际上有多个副本可供选择(看到前面答案中的剪切/粘贴说明其他人也注意到了这一点)。当脚本与不同级别和脚本引擎嵌套时,定制副本不会按需执行。我们需要的是像C
    #ifndef…
    一样工作的东西,它只能识别一次主机上下文(我称之为主机上下文)。虽然我认为仅仅结束这个问题是不正确的,但我相信修订后的描述中包含了一个很好的80%的解决方案。这样,有类似需求的人可能会发现
    export…
    概念很有用。(根据80:20规则)。这是一个类结果,但仅适用于终端外壳;当在脚本中使用时,结果是可以预料的:“bash”或调用shell的程序~sigh~我认为需要改进的是在启动脚本中导出类似于:
    SEED_TERM
    的内容。您的脚本将始终运行在进程树中与终端程序相同的相对位置。你可以沿着父PID路径一直走到你找到它为止,如果你愿意的话。事实上,他们没有。关于这一点,其他地方还有一个很长的问题。
    $ echo $command
    xterm