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

Clu*_*oob 31 command-line xterm

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

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

所以只是出于好奇,为什么/如何发生这种情况?

Wil*_*ilf 26

我(猜测)这是因为您提供的第一个参数xterm是要使用的shell - xterm bash(或xterm /bin/bashxterm python等。

所以它运行xterm,尝试xterm作为一个 shell 启动,它启动另一个xterm作为那个 shell,然后另一个,另一个......

您可能可以通过运行找到更多关于此的信息 man xterm

  • 是的。第一个 `xterm` 将 `$SHELL` 设置为 `xterm`,并启动另一个 `xterm` 作为它的 shell。另一个 `xterm` 使用 `$SHELL` 中的命令作为它的 shell,从而启动另一个 `xterm`,... (24认同)
  • 答案的这一部分不清楚:“它启动了另一个 `xterm` 作为那个 shell”。为什么会这样?感谢 @FlorianDiesch 解释那部分。 (6认同)
  • 我明白为什么第一个 `xterm` 启动第二个 `xterm`:因为你输入了 `xterm xterm`。但是为什么第二个 `xterm` 开始第三个 `xterm`?你没有输入 `xterm xterm xterm`,所以第三个 `xterm` 开始的原因并不明显。弗洛里安的评论解释了原因。 (3认同)

小智 16

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

长版:

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

进一步阅读: man xterm