Was macht yes $ (yes yes)?

23

yesIch fragte mich, was der Befehl wohl nützen könnte, stolperte über diesen Kommentar und versuchte, ihn auszuführen

yes $(yes yes)

Soweit ich yesweiß , sollte dies einfach eine unendliche Folge von ausgeben , aber stattdessen wird nichts ausgegeben und mein Grafikterminal stürzt nach einigen Sekunden ab. (Wenn ich es auf tty1 ausführe, sehe ich nach einiger Zeit die Anmeldeaufforderung.)

Was passiert hier?

heinrich5991
quelle
2
Ich bin kein Experte, aber es könnte sein, dass der erste Aufruf versucht, unendlich viele Male zu drucken. (Oder das Argument kann einfach zu lang sein.)
Strugee
5
@strugee Die Argumentliste wird nie aufgefüllt, da yesnie zurückgegeben.
Chris Down
@strugee Sie können "unendlich unendliche Zeiten" mit xargs: yes yes | xargs -P 0 yes(oder ohne -P 0für Single-Process Infinity)
Kyle Strand

Antworten:

25

Zum Laufen sollte es schon reichen

 echo $(yes yes)

Der $(...)führt den inneren Befehl aus, bis er beendet ist, und erfasst alle seine Ausgaben. - Da yesBash nun eine lange Zeit läuft und eine Menge Output erzeugt, wird es irgendwann keinen Speicher mehr geben und abstürzen.

michas
quelle
6

Um die Meldung für den Fehler anzuzeigen, durch den Ihre Shell geschlossen wird, müssen Sie eine Sub-Shell ausführen.

$ sh
$ kill -9 $$
Killed
$

$ sh
$ yes $(yes yes)
sh: xrealloc: cannot allocate 18446744071562067968 bytes
$
sourcejedi
quelle
1
16 Millionen Gigabyte, was? Gordon Moore lauert in einer Ecke gehen : „Nun ... ich meine, nicht ganz noch ...“
Ferd