Функция в функции не будет вызываться несколько раз по запросу?

Функция в функции не будет вызываться несколько раз по запросу?
> 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 раза.

Согласно "реальному 0m1.026s" похоже, что сон выполняется только один раз. Или если он параллельный (??), то как мне сделать его линейным?

решение1

Части трубопровода запускаются (почти) одновременно.

Все три вызова secondначнутся одновременно. Три подоболочки, которые это даст, вызовут firstрасширение "$(first)", и три sleep 1вызова произойдут одновременно (вы можете увидеть в выводе трассировки, что ониделатьслучаться).

Только ввод-вывод сериализует конвейер, т. е. один процесс в конвейере ждет ввода от предыдущего или ждет, пока его вывод будет прочитан следующим.

Чтобы части конвейера запускались, выполнялись и завершались последовательно:

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

То есть запускать их по отдельности и сохранять промежуточные результаты в файлах.

Связанный контент