¿Qué hace yes $ (yes yes)?

23

Preguntándome qué uso yespodría tener el comando, me topé con este comentario e intenté ejecutar

yes $(yes yes)

Por lo que entiendo, esto simplemente debería imprimir una secuencia infinita de yes, pero en su lugar no genera nada y bloquea mi terminal gráfica después de unos segundos. (Si lo ejecuto en tty1, veo el mensaje de inicio de sesión después de un tiempo).

¿Que está sucediendo aquí?

heinrich5991
fuente
2
No soy un experto, pero podría ser que la primera invocación está tratando de imprimir infinito infinitas veces. (o el argumento puede ser simplemente demasiado largo).
Strugee
55
@strugee La lista de argumentos nunca se llena, porque yesnunca regresa.
Chris Down
@strugee Puedes obtener "infinito infinito" usando xargs: yes yes | xargs -P 0 yes(o sin -P 0infinito de un solo proceso)
Kyle Strand

Respuestas:

25

Ya debería ser suficiente para correr

 echo $(yes yes)

El $(...)ejecuta el comando interno hasta que finaliza y captura toda su salida. - Ahora que se yesejecuta mucho tiempo y genera una gran cantidad de resultados, bash eventualmente se quedará sin memoria y se bloqueará.

michas
fuente
6

Para ver el mensaje del error que cierra su shell, debe ejecutar un sub-shell.

$ sh
$ kill -9 $$
Killed
$

$ sh
$ yes $(yes yes)
sh: xrealloc: cannot allocate 18446744071562067968 bytes
$
sourcejedi
fuente
1
16 millones de gigabytes, ¿eh? Gordon Moore se esconde en un rincón ir, "Bueno ... quiero decir, no es sin embargo ..."
Ferd