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?


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.


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
$

1
16 milionów gigabajtów, co? Gordon Moore czai się w kącie i
pyta:
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.