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