Pourquoi la commande «xterm xterm» crée-t-elle une récursion infinie?

31

J'utilise Ubuntu 14.04 (64 bits). Lorsque j'ai découvert la commande pour la première fois xterm, j'ai essayé la commande xterm xtermet elle a commencé à ouvrir à l'infini de nouvelles fenêtres xterm.
ctrl + Cl'arrête immédiatement et ferme toutes les fenêtres.

Mais je voulais voir jusqu'où cela allait et le laisser fonctionner aussi longtemps que possible. Il a consommé presque toute la RAM et a finalement été fermé (je pense par le système lui-même).

Alors juste par curiosité, pourquoi / comment cela se produit-il?

CluelessNoob
la source
3
Hors sujet: il a été fermé car il a probablement utilisé trop de mémoire et a été tué par le tueur OOM (out-of-memory).
Léo Lam
5
Cela devrait être corrigé par la version 301 : "ne définir SHELLla variable d'environnement que pour les programmes trouvés dans /etc/shells(invité par le patch / rapport par Al Poole)". (Les réponses expliquent ce qu'est la SHELLvariable d'environnement).
Cristian Ciupitu
@CristianCiupitu - +1 - Je viens d'installer la version 308 - et au lieu d'ouvrir des terminaux récurrents, il en ouvre un vierge et un second avec bash (le second étant probablement le `` shell '' du premier xterm.
Wilf

Réponses:

26

Je suppose que c'est parce que le premier paramètre auquel vous donnez xtermest le shell à utiliser - xterm bash(ou xterm /bin/bash), xterm pythonetc.

Il s'exécute donc xterm, essaie de démarrer en xtermtant que shell, qui en démarre un autre en xtermtant que shell, puis un autre, et un autre ...

Vous pouvez probablement trouver un peu plus à ce sujet en exécutant man xterm

Wilf
la source
24
Oui. Les premiers xtermjeux $SHELLà xtermet commence une autre xtermque sa coquille. Cet autre xtermutilise la commande $SHELLcar il est shell, en commençant ainsi un autre xterm, ...
Florian Diesch
6
Cette partie de la réponse n'est pas claire: "qui en démarre une autre xtermcomme celle-là". Pourquoi cela se produit-il? Merci @FlorianDiesch d'avoir expliqué cette partie.
John Kugelman prend en charge Monica le
@JohnKugelman - le premier xtermcommence le second xtermcomme coquille, le second xtermcommence le troisième xtermcomme coquille, le troisième commence le quatrième comme coquille ... etc
Wilf
3
Je comprends pourquoi le premier xtermcommence le second xterm: c'est parce que vous avez tapé xterm xterm. Mais pourquoi le deuxième xtermcommence-t-il le troisième xterm? Vous n'avez pas tapé xterm xterm xterm, donc ce n'est pas évident pourquoi le troisième xtermcommence. Le commentaire de Florian explique pourquoi.
John Kugelman prend en charge Monica le
1
Alors juste par curiosité c'est aussi possible avec gnome-terminal?
TuKsn
16

Version courte: l'argument de xterm est le shell à exécuter par xterm; shell est défini dans l'environnement var, donc les appels suivants font une 10 PRINT "xterm" 20 GOTO 10récursivité.

Version longue:

  1. xterm xtermpasse xtermà l'appel xterm en tant que shell de xterm en définissant la $SHELLvariable sur xterm(le 1er paramètre de xterm est interprété comme shell à exécuter)
  2. puis, xterm exécuté par votre xterm xtermcommande exécute le $SHELL- dans ce cas, créant une autre instance xterm (car $SHELL=xtermmaintenant)
  3. $SHELL=xterm déjà, donc le xterm nouvellement créé s'exécute xterm
  4. goto 3

Lectures complémentaires: man xterm

vaxquis
la source