> 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 second
começarão ao mesmo tempo. Os três subshells que isso dá origem serão invocados first
para expansão "$(first)"
e as três sleep 1
chamadas 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.