> 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
也就是说,分别运行它们并将中间结果存储在文件中。