요청하면 함수 내의 함수가 여러 번 호출되지 않습니까?

요청하면 함수 내의 함수가 여러 번 호출되지 않습니까?
> 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

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

관련 정보