필요한 경우 함수 내의 함수가 여러 번 호출되지 않습니까?

필요한 경우 함수 내의 함수가 여러 번 호출되지 않습니까?
> 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호출은 동시에 발생합니다(추적 출력에서 ​​볼 수 있습니다).하다발생하다).

I/O 직렬화된 파이프만 있습니다. 즉, 파이프의 한 프로세스는 이전 프로세스의 입력을 기다리거나 다음 프로세스가 출력을 읽을 때까지 기다립니다.

파이프라인의 다양한 부분을 순서대로 시작, 실행 및 종료하려면 다음을 수행하세요.

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

즉, 별도로 실행하고 중간 결과를 파일에 저장합니다.

관련 정보