A função na função não será chamada várias vezes se solicitado?

3
> 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 este 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 o "real 0m1.026s", parece que o sono é executado apenas uma vez. Ou se é paralelo (??), então como posso torná-lo linear?

    
por pepite 14.04.2017 / 20:23

1 resposta

3

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

Todas as três invocações de second começarão ao mesmo tempo. As três subshells que isso dá origem invocarão first para expandir "$(first)" e as três sleep 1 chamadas ocorrerão simultaneamente (você pode ver na saída de rastreio que elas acontecem ). / p>

É apenas a E / S que serializa um pipeline, ou seja, um processo no pipeline que aguarda a entrada do anterior ou espera que sua saída seja lida pela próxima.

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.

    
por 14.04.2017 / 21:29