내가 이해한 바에 따르면 인터프리터는 코드를 한 줄씩 실행하지만 내 추론이 틀릴 수도 있음을 알 수 있습니다. 이 예에서 첫 번째 if
줄이 true를 반환하는 경우 프로그램은 fi
뒤로 이동하는 방법을 알고 있습니까 echo "APPROVED"
(그리고 어느 줄에 있는지 알고 있습니까 fi
?) 아니면 다음 줄을 확인하고 한 줄 안에 나타날 때 실행하지 않는 데 여전히 시간이 걸립니다. elif
또는 else
?
if [ $AVERAGE -ge "6" ]
then
echo "APPROVED"
# Does shell know how to directly get from here /\...
elif [ $AVERAGE -lt "2" ]
then
echo "FAILED"
else
echo "RETAKE TEST"
# ... To here? \/
fi
감사합니다!
답변1
Michael Horner가 지적했듯이 쉘은 전체 명령을 먼저 구문 분석해야 합니다. 왜냐하면 명령이 파이프에 있거나 백그라운드에 있으면 명령 실행에 영향을 미치기 때문입니다. 이는 쉘에 의해 실행되는 모든 명령에 해당됩니다. 대화형 프롬프트에서 여러 줄의 쉘 명령을 작성하면 명령을 실행하기 전에 명령이 완료될 때까지 기다리기 때문에 매우 분명합니다.
쉘은 각 조건을 올바르게 실행하고 조건이 true일 때 중지됩니다. 추가 elif 조건을 실행하지 않습니다. POSIX는 Unix 쉘의 동작을 명확하게 지정합니다.
셸이 더 빠르게 또는 더 효율적으로 실행되도록 최적화되었는지 여부는 구현 품질의 문제입니다. 작은 쉘(예: busybox의 쉘)은 속도가 약간 느리더라도 가능한 한 작은 것을 선호하는 반면, 다른 쉘은 더 많은 최적화를 선호할 수 있습니다.
일반적으로 쉘 스크립팅은 결국 많은 프로세스를 분기하고 실행하게 되므로 코드를 작성하는 매우 효율적인 방법이 아닙니다. 따라서 제 경험상 일반적인 최적화 컴파일러에서 찾은 최적화는 존재하지 않는 경향이 있습니다. 개선되지 않았기 때문입니다. 많이. 더 많은 내장 명령을 제공하는 것이 외부 프로세스를 전혀 생성할 필요를 없애고 비용 대비 더 많은 효과를 제공하는 것이 더 효율적인 경우가 많습니다.