Função em função não será chamada várias vezes se solicitada?

Função em função não será chamada várias vezes se solicitada?
> cat b.txt 
function first
    {
    sleep 1
    echo $(echo $$)
    }

function second
    {
    openssl enc -aes-256-cbc -k "$(first)"
    }

echo nyi | second | second | second
> 
> time sh -x b.txt 
+ echo nyi
+ second
+ second
+ second
++ first
++ sleep 1
++ first
++ sleep 1
++ first
++ sleep 1
+++ echo 32383
+++ echo 32383
++ echo 32383
++ echo 32383
+ openssl enc -aes-256-cbc -k 32383
+++ echo 32383
+ openssl enc -aes-256-cbc -k 32383
++ echo 32383
+ openssl enc -aes-256-cbc -k 32383
ɚ��2;��<�Vp��H�����F�q�AHO��Sܽd��d4��X��#}
real    0m1.026s
user    0m0.016s
sys 0m0.025s
> 

Pergunta: por que esse script é executado por pelo menos 3 segundos?

Existe um "sleep 1" na primeira função e deve ser chamado 3 vezes na segunda função.

De acordo com os "0m1.026s reais" parece que o sono só é executado uma vez. Ou se for paralelo (??), como posso torná-lo linear?

Responder1

As partes de um pipeline são iniciadas (quase) simultaneamente.

Todas as três invocações de secondcomeçarão ao mesmo tempo. Os três subshells que isso dá origem serão invocados firstpara expansão "$(first)"e as três sleep 1chamadas acontecerão simultaneamente (você pode ver na saída do trace que elasfazeracontecer).

É apenas a E/S que serializa um pipeline, ou seja, um processo no pipeline aguardando a entrada do anterior ou esperando que sua saída seja lida pelo próximo.

Para que os bits do pipeline sejam iniciados, execute e saia em sequência:

echo nyi | second >out1
second <out1 >out2
second <out2

Ou seja, execute-os separadamente e armazene os resultados intermediários em arquivos.

informação relacionada