如果需要,函数中的函数不会被多次调用?

如果需要,函数中的函数不会被多次调用?
> 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
> 

问题:为什么这个脚本运行至少 3 秒?

第一个函数中有一个“sleep 1”,第二个函数中应该调用它3次。

根据“real 0m1.026s”,睡眠似乎只执行一次。或者如果它是平行的(??)那么我怎样才能使它成为线性?

答案1

管道的各个部分同时(接近)启动。

所有三个调用second将同时开始。这产生的三个子 shell 将调用first展开"$(first)",并且这三个sleep 1调用将同时发生(您可以在跟踪输出中看到它们)发生)。

只有 I/O 序列化管道,即管道中的一个进程等待前一个进程的输入,或者等待下一个进程读取其输出。

要让管道的​​各个部分按顺序启动、运行和退出:

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

也就是说,分别运行它们并将中间结果存储在文件中。

相关内容