¿La función en función no se llamará varias veces si se solicita?

¿La función en función no se llamará varias veces si se solicita?
> 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
> 

Pregunta: ¿Por qué este script se ejecuta durante al menos 3 segundos?

Hay un "dormir 1" en la primera función y debe llamarse 3 veces en la segunda función.

Según los "0m1.026s reales" parece que el sueño sólo se ejecuta una vez. O si es paralelo (??), ¿cómo puedo hacerlo lineal?

Respuesta1

Las partes de una tubería se inician (casi) simultáneamente.

Las tres invocaciones de secondcomenzarán al mismo tiempo. Los tres subniveles a los que esto da lugar invocarán firstla expansión "$(first)"y las tres sleep 1llamadas se realizarán simultáneamente (puede ver en el resultado del seguimiento quehacersuceder).

Es solo la E/S la que serializa una canalización, es decir, un proceso en la canalización esperando la entrada del anterior, o esperando que el siguiente lea su salida.

Para que los bits de la tubería se inicien, ejecuten y salgan en secuencia:

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

Es decir, ejecutarlos por separado y almacenar los resultados intermedios en archivos.

información relacionada