O que sim $ (yes yes) faz?

23

Pensando em qual seria o uso do yescomando, deparei-me com este comentário e tentei executar

yes $(yes yes)

Pelo que entendi, isso deve simplesmente imprimir uma sequência infinita de yes, mas não gera nada e trava meu terminal gráfico após alguns segundos. (Se eu executá-lo em tty1, vejo o prompt de login após algum tempo.)

O que esta acontecendo aqui?

heinrich5991
fonte
2
Não sou especialista, mas pode ser que a primeira invocação esteja tentando imprimir infinito vezes infinitas. (ou o argumento pode ser simplesmente demasiado longo.)
strugee
5
@ strugee A lista de argumentos nunca é preenchida, porque yesnunca retorna.
Chris Baixo
@strugee Você pode obter "infinito infinitas vezes" utilizando xargs: yes yes | xargs -P 0 yes(ou sem -P 0para o infinito processo single)
Kyle Strand

Respostas:

25

Já deve ser o suficiente para executar

 echo $(yes yes)

Ele $(...)executa o comando interno até que seja concluído e captura toda a sua saída. - Agora, como yesdemora muito e gera muita saída, o bash acabará ficando sem memória e trava.

michas
fonte
6

Para ver a mensagem do erro que fecha seu shell, você precisa executar um sub shell.

$ sh
$ kill -9 $$
Killed
$

$ sh
$ yes $(yes yes)
sh: xrealloc: cannot allocate 18446744071562067968 bytes
$
sourcejedi
fonte
1
16 milhões de gigabytes, não é? Gordon Moore está escondido em um canto vai, "Bem ... Quero dizer, não é bem ainda ..."
Ferd