> 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
즉, 별도로 실행하고 중간 결과를 파일에 저장합니다.