为什么命令“ xterm xterm”会创建无限递归?


31

我正在运行Ubuntu 14.04(64位)。当我第一次发现有关命令时xterm,我尝试了该命令xterm xterm,它开始无限打开新的xterm窗口。
ctrl + C立即停止并关闭所有窗口。

但是我想看看它能走多远,并让它尽可能长地运行。它几乎吞噬了所有RAM,并最终关闭了(我认为是系统本身)。

因此,出于好奇,为什么/如何发生?


3
离题:它被关闭,因为它可能使用了过多的内存并被OOM(内存不足)杀手杀死。
Lam

5
这应该由版本301修复:“仅将SHELL环境变量设置为在其中找到的程序/etc/shells(由Al Poole修补/报告提示)”。(答案说明了SHELL环境变量的含义)。
Cristian Ciupitu 2014年

@CristianCiupitu - 1 - I刚刚安装的版本308 -和代替开口重复终端,它打开一个空白一个,并且第二个使用bash(第二想必是所述第一的xterm的“外壳”。
维尔夫

Answers:


26

我(猜测),这是因为你给第一个参数xterm外壳使用- xterm bash(或xterm /bin/bash),xterm python等等。

因此它运行了xterm,尝试以xterm外壳程序启动xterm,然后以该外壳程序启动另一个,然后又启动另一个...

您可能可以通过运行以下内容找到更多信息 man xterm


24
是。第一个xterm设置$SHELLxterm并启动另一个xterm作为其外壳。那另一个xterm$SHELL外壳中使用该命令,从而启动另一个命令xterm,...
Florian Diesch 2014年

6
答案的这一部分尚不明确:“哪个xterm将以该shell 启动另一个”。为什么会这样呢?感谢@FlorianDiesch解释了这一部分。
John Kugelman支持Monica 2014年

@JohnKugelman-第一个xterm启动第二个xterm作为其外壳,第二个xterm启动第三个xterm作为其外壳,第三个启动第四个作为其外壳...等等
Wilf 2014年

3
我知道为什么第一个xterm开始第二个xterm:因为您键入了xterm xterm。但是为什么第二个xterm开始第三个xterm呢?您没有输入xterm xterm xterm,因此不清楚为什么第三个xterm开始。弗洛里安的评论解释了原因。
John Kugelman支持Monica

1
因此,出于好奇,还可以gnome-terminal吗?
TuKsn 2014年

16

简短版本:xterm的参数是xterm要执行的shell;shell是在环境var中设置的,因此进一步的调用会进行10 PRINT "xterm" 20 GOTO 10递归。

长版:

  1. xterm xterm通过xterm$SHELL变量设置为将作为xterm的外壳传递给xterm调用(xterm的xterm第一个参数被解释为要执行的外壳)
  2. 然后,由您的xterm xterm命令执行的xterm将执行$SHELL-在这种情况下,将创建另一个xterm实例(因为$SHELL=xterm现在)
  3. $SHELL=xterm 已经,所以新创建的xterm执行 xterm
  4. 转到3

进一步阅读: man xterm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.