Dlaczego polecenie „xterm xterm” tworzy nieskończoną rekurencję?


31

Używam Ubuntu 14.04 (64-bitowy). Kiedy po raz pierwszy dowiedziałem się o poleceniu xterm, wypróbowałem polecenie xterm xtermi zaczęło się nieskończenie otwierać nowe okna xterm.
ctrl + Czatrzymuje go natychmiast i zamyka wszystkie okna.

Ale chciałem zobaczyć, jak daleko się posuwa i pozwolić mu działać tak długo, jak to możliwe. Zjadł prawie całą pamięć RAM i ostatecznie został zamknięty (myślę, że przez sam system).

Więc z ciekawości, dlaczego / jak to się dzieje?


3
Poza tematem: został zamknięty, ponieważ prawdopodobnie zużył zbyt dużo pamięci i został zabity przez zabójcę OOM (brak pamięci).
Léo Lam

5
Powinno to zostać naprawione w wersji 301 : „ustaw SHELLzmienną środowiskową tylko na programy znalezione w /etc/shells(monit przez łatkę / raport Al Poole)”. (Odpowiedzi wyjaśniają, co jest ze SHELLzmienną środowiskową).
Cristian Ciupitu

@CristianCiupitu - +1 - Właśnie zainstalowałem wersję 308 - i zamiast otwierać powtarzające się terminale, otwiera pusty, a drugi z bashem (drugi prawdopodobnie jest „powłoką” pierwszego xtermu.
Wilf

Odpowiedzi:


26

Myślę, że to dlatego, że pierwszym parametrem, który podajesz, xtermjest powłoka do użycia - xterm bash(lub xterm /bin/bash) xterm pythonitp.

Działa więc xterm, próbuje zacząć xtermjako powłoka, która zaczyna się xtermjako powłoka, potem kolejna i kolejna ...

Prawdopodobnie możesz znaleźć więcej informacji na ten temat, uruchamiając man xterm


24
Tak. Pierwsze xtermzestawy $SHELLdo xtermi rozpoczyna kolejny xtermjako jego powłoki. Ten drugi xtermużywa polecenia, $SHELLponieważ jest to powłoka, a tym samym uruchamianie kolejnego xterm, ...
Florian Diesch

6
Ta część odpowiedzi nie jest jednoznaczna: „która zaczyna następną xtermjak ta powłoka”. Dlaczego tak się dzieje? Dzięki @FlorianDiesch za wyjaśnienie tej części.
John Kugelman wspiera Monikę

@JohnKugelman - pierwszy xtermzaczyna drugi xtermjako skorupa, drugi xtermzaczyna trzeci xtermjako skorupa, trzeci zaczyna czwarty jako powłoka ... itd.
Wilf

3
Rozumiem, dlaczego pierwszy xtermzaczyna się drugi xterm: to dlatego, że piszesz xterm xterm. Ale dlaczego drugi xtermzaczyna trzeci xterm? Nie wpisałeś xterm xterm xterm, więc nie jest oczywiste, dlaczego xtermzaczyna się trzecia . Komentarz Floriana wyjaśnia dlaczego.
John Kugelman wspiera Monikę

1
Więc z ciekawości jest to również możliwe gnome-terminal?
TuKsn

16

Krótka wersja: argument xterm jest powłoką do wykonania przez xterm; shell jest ustawiony w var var, więc kolejne wywołania wykonują 10 PRINT "xterm" 20 GOTO 10rekurencję.

Długa wersja:

  1. xterm xtermprzechodzi xtermdo wywołania xterm jako powłoka xterm poprzez ustawienie $SHELLzmiennej na xterm(pierwszy parametr xterm jest interpretowany jako powłoka do wykonania)
  2. następnie xterm wykonany przez twoje xterm xtermpolecenie wykonuje $SHELL- w tym przypadku, tworząc kolejną instancję xterm (ponieważ $SHELL=xtermteraz)
  3. $SHELL=xterm już, więc nowo utworzony xterm wykonuje się xterm
  4. Goto 3

Dalsza lektura: man xterm

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.