> 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
То есть запускать их по отдельности и сохранять промежуточные результаты в файлах.