bash 및 zsh에서 "time" 키워드(내장 함수 사용)를 사용하면 어떤 코드가 작동합니까?

bash 및 zsh에서 "time" 키워드(내장 함수 사용)를 사용하면 어떤 코드가 작동합니까?

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이는 예약어도 아니고 내장 명령도 아닙니다. 외부 명령이므로 다른 명령에는 적용할 수 없습니다.간단한 명령. timeBSD의 외부 명령은 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인터프리터 내부에서 구현되어야 합니다.

관련 정보