Почему команда «xterm xterm» создает бесконечную рекурсию?

31

Я использую Ubuntu 14.04 (64 бит). Когда я впервые узнал о команде xterm, я попробовал команду xterm xterm, и она начала бесконечно открывать новые окна xterm.
ctrl + Cнемедленно останавливает его и закрывает все окна.

Но я хотел посмотреть, как далеко он зайдет, и позволить ему бегать так долго, как может. Он израсходовал почти всю оперативную память и в конечном итоге был закрыт (я думаю, сама система).

Так просто из любопытства, почему / как это происходит?

CluelessNoob
источник
3
Не по теме: он был закрыт, потому что, вероятно, использовал слишком много памяти и был убит убийцей OOM (нехватка памяти).
Лео Лам
5
Это должно быть исправлено версией 301 : «устанавливать SHELLпеременные окружения только для программ, найденных в /etc/shells(вызвано патчем / отчетом от Al Poole)». (Ответы объясняют, что с SHELLпеременной среды).
Кристиан Чиупиту
@CristianCiupitu - +1 - я только что установил версию 308 - и вместо того, чтобы открывать повторяющиеся терминалы, он открывает пустой и второй с bash (второй предположительно является «оболочкой» первого xterm.
Уилф

Ответы:

26

Я (думаю), это потому, что первый параметр, который вы даете, xtermэто оболочка для использования - xterm bash(или xterm /bin/bash) и xterm pythonт. Д.

Таким образом, он запускается xterm, пытается запустить xtermкак оболочку, которая запускает другую xtermкак эту оболочку, затем другую и другую ...

Вы можете найти немного больше об этом, запустив man xterm

Уилф
источник
24
Да. Первые xtermнаборы $SHELLк xtermи начинается другое , xtermкак его оболочки. Этот другой xtermиспользует команду в $SHELLкачестве оболочки, таким образом xterm,
запускает
6
Эта часть ответа не ясна: «которая запускает другую xtermкак оболочку». Почему это происходит? Спасибо @FlorianDiesch за объяснение этой части.
Джон Кугельман поддерживает Монику
@JohnKugelman - первый xtermзапускает второй в xtermкачестве оболочки, второй xtermзапускает третий в xtermкачестве оболочки, третий запускает четвертый в качестве оболочки ... и т. Д.
Уилф
3
Я понимаю, почему первый xtermначинает второй xterm: это потому, что вы напечатали xterm xterm. Но почему второй xtermначинает третий xterm? Вы не печатали xterm xterm xterm, так что не понятно, почему xtermначинается третий . Комментарий Флориана объясняет почему.
Джон Кугельман поддерживает Монику
1
Так просто из любопытства это тоже возможно gnome-terminal?
TuKsn
16

Краткая версия: аргумент xterm - это оболочка для выполнения xterm; shell устанавливается в среде var, поэтому дальнейшие вызовы выполняют 10 PRINT "xterm" 20 GOTO 10рекурсию.

Длинная версия:

  1. xterm xtermпереходит xtermк вызову xterm в качестве оболочки xterm, устанавливая $SHELLпеременную в xterm(1-й параметр xterm интерпретируется как оболочка для выполнения)
  2. затем xterm, выполняемый вашей xterm xtermкомандой, выполняет $SHELL- в этом случае, создавая другой экземпляр xterm (потому что $SHELL=xtermсейчас)
  3. $SHELL=xterm уже, поэтому вновь созданный xterm выполняет xterm
  4. перейти к 3

Дальнейшее чтение: man xterm

vaxquis
источник