Co robi tak $ (tak tak)?

23

Zastanawiając się, do czego yesmoże służyć polecenie, natknąłem się na ten komentarz i spróbowałem go wykonać

yes $(yes yes)

Z tego, co rozumiem, powinno to po prostu wydrukować nieskończoną sekwencję yes, ale zamiast tego nic nie wyprowadza i po kilku sekundach zawiesza mój terminal graficzny. (Jeśli wykonam to na tty1, po pewnym czasie widzę monit o zalogowanie).

Co tu się dzieje?

heinrich5991
źródło
2
Nie jestem ekspertem, ale być może pierwsze wywołanie próbuje wydrukować nieskończoność razy. (lub kłótnia może być po prostu zbyt długa).
strugee
5
@strugee Lista argumentów nigdy nie jest wypełniana, ponieważ yesnigdy nie zwraca.
Chris Down,
@strugee Możesz uzyskać „nieskończoność razy nieskończoności”, używając xargs: yes yes | xargs -P 0 yes(lub bez -P 0dla nieskończoności jednoprocesowej)
Kyle Strand

Odpowiedzi:

25

Powinno już wystarczyć

 echo $(yes yes)

$(...)Uruchamia polecenie wewnętrzne, dopóki nie zostanie zakończone i przechwytuje wszystkie swoje wyjście. - Teraz, gdy yesdziała długo i generuje dużo danych wyjściowych, bash w końcu zabraknie pamięci i ulegnie awarii.

michas
źródło
6

Aby zobaczyć komunikat o błędzie zamykającym powłokę, musisz uruchomić podpowłokę.

$ sh
$ kill -9 $$
Killed
$

$ sh
$ yes $(yes yes)
sh: xrealloc: cannot allocate 18446744071562067968 bytes
$
sourcejedi
źródło
1
16 milionów gigabajtów, co? Gordon Moore czai się w kącie i
pyta: