Bash에서는 일반적으로 time cmd
여러 유형에 대해 다음을 수행합니다.cmd
$ time true
real 0m0.000s
user 0m0.000s
sys 0m0.000s
출력 형식을 변경할 수 있습니다(time -p를 사용하여 posix 형식으로도 가능).
$ TIMEFORMAT='real %R'; time true
real 0.000
그러나 zsh는 간단한 명령에 대한 시간을 보고하지 않습니다( try time echo
).
% time true
명령을 파이프로 변환하면 다른 내용이 보고됩니다.
$ zsh -c 'time echo yes | cat'
yes
echo yes 0.00s user 0.00s system 26% cpu 0.001 total
cat 0.00s user 0.00s system 85% cpu 0.002 total
쉘이 서브쉘을 통해 시간 출력을 제공하도록 강제할 수 있습니다 (…)
.
$ zsh -c 'time ( true )'
( true; ) 0.00s user 0.00s system 26% cpu 0.005 total
그러나 이는 작동하지 않으며 {…}
다음 내장 함수에서도 작동하지 않습니다 for
.
$ zsh -c 'time { for i in $(seq 100); do ls; done >/dev/null; }'
zsh는 어떻게 서브쉘 없이 간단한 명령을 받아들일 수 있습니까?
또는 더 간단한 질문:
time 키워드를 사용하여 ksh, bash, zsh에서 실행되는 코드를 작성하는 방법이 있습니까?
답변1
time
명령의 시간이 정해지지 않았습니다. ~에서단일 유닉스 사양이유:
용어유용대신에 사용주문하다, 쉘 복합 명령, 파이프, 특수 내장 명령 등을 직접 사용할 수 없다는 사실을 강조합니다.
이것스테인레스 스틸time
결과도 지적됐다.특별한내장 명령은 정의되지 않으며 그 결과는 다음을 제외하고 사용됩니다.간단한 명령(즉, 파이프 또는 명령 그룹화에서) 지정되지 않았습니다.
이것 time
이기 때문이다아니요특별한 쉘 구문이 필요하지 않으며 내장 명령도 필요하지 않습니다. 처음 표준화되었을 때 많이 바뀌었든, 지금도 많이 바뀌었습니다.
- Almquist 및 (Heirloom) Bourne 쉘에서
time
이는 예약어도 아니고 내장 명령도 아닙니다. 외부 명령이므로 다른 명령에는 적용할 수 없습니다.간단한 명령.time
BSD의 외부 명령은wait4()
라이브러리 함수에 의해 커널에서 반환된 프로세스 사용 정보를 사용합니다. 쉘 내장 명령과 파이프의 시간을 측정하려면 시간을 측정할 프로그램이 쉘이어야 합니다. 따라서time bindkey
실행할 유틸리티를 찾지 못하는 것과time echo
작업 타이밍과 같은 것외부echo
쉘 내장이 아닌 명령. - C 쉘에는
time
다음 외에는 적용할 수 없는 내장 명령이 있습니다.간단한 명령. 기다려야 하는 하위 프로세스가 필요한time
라이브러리 함수의 결과를 확인하여 작동합니다 .wait4()
그래서 C 쉘은time
항상 하위 프로세스를 분기합니다., 다른 내장 명령의 경우에도 마찬가지입니다. 이와 같은 것은time bindkey -v
자식 프로세스에서 실행된 결과이기 때문에 아무 소용이 없다는 것을 알게 될 것입니다time
. - Korn 및 Bourne Again 쉘에서
time
파이프에 적용할 수 있는 쉘 구문의 예약어입니다. 이러한 쉘은 라이브러리 함수에서 반환된 하위 프로세스 사용 정보를 사용하지 않고wait4()
대신 명령 호출을 해당 호출과 함께 대괄호로 묶은 후getrusage()
이를 빼서 시간을 계산합니다. - Z 셸에서
time
파이프에 적용할 수 있는 셸 구문의 예약어입니다. Z 셸은 라이브러리 함수에 의해 커널에서 반환된 프로세스 사용 정보를 사용wait4()
하지만 내장 명령을 강제로 분기하지는 않습니다. 그래서 아무 것도 보고하지 않습니다.하위 프로세스가 분기되지 않은 경우(내장 명령의 경우와 마찬가지로 ) 실제로 무언가를 달성하는true
것과 같습니다 .time set -o vi
기본 원칙에 명시된 바와 같이,단일 유닉스 사양모든 다른 동작을 허용하기 위해 느슨하게 표현되었습니다. 이는 타이밍 쉘 내장에 문제가 있음을 나타냅니다.
답변2
대부분의 쉘은 외부 및 내장 명령의 타이밍을 지원하지만 zsh는 내장 명령의 타이밍을 지원하지 않습니다.
시간 결과를 얻으려면 전화하십시오.
time /bin/true
또는 zsh 직원에게 버그 보고서를 보내십시오.
새로운 정보가 나오면 상황이 다르게 보입니다.
time
타이밍 복합 명령은 셸의 예약어인 경우에만 작동합니다.
따라서 두 가지 제한 요소가 있습니다.
쉘은 내장 명령의 시간을 측정할 수 있어야 합니다.
time
쉘은 쉘 구문을 향상시키는 예약어로 구현되어야 합니다.
이렇게 하면 잠재적인 쉘 후보 목록이 다음과 같이 줄어듭니다.
bosh bash mksh ksh
내장 명령의 경우 쉘은 자체 타이밍을 측정하는 방법을 알아야 합니다.
복잡한 명령의 경우 쉘은 time
인터프리터 내부에서 구현되어야 합니다.