如果需要,函數中的函數不會被多次呼叫?

如果需要,函數中的函數不會被多次呼叫?
> 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

也就是說,分別運行它們並將中間結果儲存在文件中。

相關內容