1 실행 시간을 측정하는 방법

1번 문제의 쉘 프로그램 내용을 정리하자면 시작 시간을 start 변수에 저장하고 2.5초를 대기한 후 끝 시간을 finish 변수에 저장한다. 그 후 diff 변수에 시간차를 구해 저장하여 3개의 변수를 각 줄마다 출력하는 프로그램으로 볼 수 있다.

내용을 구체적으로 보자면 다음과 같다.

#!/bin/bash

이 줄에서 어떤 쉘을 사용할 것인지 지정을 해주었다. 1번 문제에서는 #!/bin/bash를 적어 bash를 사용하였다.

start= date +%s.%N

start 변수에 ‘date +%s.%N’이 들어간다. 여기에서 date는 현재 날짜를 출력하는 명령어이다. 여기에 %s와 %N 옵션을 넣어 주었는데, %s는 대문자 S일 때에는 초를 나타내고, 소문자 s일때는 unix time stamp로 현재 시간이 나타난다. UNIX time 이란, 1970년 1월 1일 00:00:00 UTC 로부터 현재까지의 누적된 초 값을 의미한다. 다음으로 %N은 나노초 단위의 현재 시간을 출력한다. 따라서 ‘date +%s.%N’는 date 명령어와 옵션을 통해 초와 나노초 단위의 현재 시간을 나타내며, 이는 start 변수에 할당된다.

그 다음 # run something은 주석 상태라 실행에 영향을 주지 않는다.

sleep 2.5

다음 줄의 sleep 2.5를 통해 2.5초동안 대기한다.

finish= date +%s.%N

finish 변수에는 위의 start 변수에 할당되었던 것과 동일하지만, 2.5초가 흐른 후의 값이기 때문에 앞에서 start에 들어갔던 시간보다 2.5초가 더해진 시간이 들어간다.

diff=$( echo "$finish - $start" | bc -l )

diff에는 finish에서 start값을 빼주는데, 이 때 bc 명령어를 사용하여 입력으로 전달된 수식을 계산하여 시간 차이를 계산할 수 있게 한다. 만약 뒤의 옵션을 빼고 실행시킨다면 계산이 되는 것이 아닌 finish 시간에서 start 시간을 빼주는 형태만 출력되게 된다(ex: diff: 1680579681.688407671 - 1680579679.186229737). 또한 finish와 start 앞에 ‘$’가 붙어 있는데, 이를 붙이지 않으면 bc -l 옵션이 없을 때에는 문자인 “finish - start”가 출력되며, -l 옵션이 있을 때에는 아무 것도 출력되지 않고, bc 옵션이 있을 때에는 0이 출력된다. 이와 동일하게 echo가 없다면 diff에는 아무 값도 들어가지 않는다. 결국 변수 diff에는 시간의 차이가 밀리초 단위까지 들어가게 된다.