> 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 second
comenzarán al mismo tiempo. Los tres subniveles a los que esto da lugar invocarán first
la expansión "$(first)"
y las tres sleep 1
llamadas 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.