> 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)"
,並且這三個子 shellsleep 1
呼叫將同時發生(您可以在追蹤輸出中看到它們)做發生)。
只有 I/O 序列化管道,即管道中的一個進程等待前一個進程的輸入,或等待下一個進程讀取其輸出。
要讓管道的各個部分按順序啟動、運行和退出:
echo nyi | second >out1
second <out1 >out2
second <out2
也就是說,分別運行它們並將中間結果儲存在文件中。