소스 명령 실행 타이밍

소스 명령 실행 타이밍

zsh 도트파일의 실행을 개선하려고 노력 중이며 하위 스크립트 실행 시간을 조정해야 합니다. 내 모습에는 다음과 같은 코드 섹션이 있습니다 .zshrc.

typeset -U config_files
config_files=($DOTFILES/**/*.zsh)
for file in  ${(M)config_files}
do
    source file
done

내가하고 싶은 일은 다음과 같습니다.

for file in  ${(M)config_files}
do
    \time -f %E source file
done

그런데 안타깝게도 이런 답변을 받았습니다.

time: cannot run source: No such file or directory

내가 어디로 잘못 가고 있습니까?

답변1

source외부 명령이 아닌 내장 명령이므로 time시간에 맞춰 외부 명령을 사용하는 것은 의미가 없습니다. 다음 중 하나를 수행합니다.

TIMEFMT=%E
for file in  ${(M)config_files}
do
    time (source file)
done

또는:

for file in  ${(M)config_files}
do
    \time -f %E zsh -c 'source "$1"' zsh "$file"
done

이전에,서브 쉘이 필요하기 때문에:

추가 참고 사항: 현재 셸에서 실행되는 모든 구성에 적용된 시간 내장은 자동으로 무시됩니다. 따라서 time 키워드 바로 뒤에 오프닝 컬리나 반복 루프 등을 넣는 것이 구문상으로는 괜찮지만 타이밍 통계를 얻을 수는 없습니다. 대신에 parens를 사용하여 서브쉘을 강제로 실행해야 하며 시간이 초과됩니다.

후자의 경우 각 파일에 대해 새로운 zsh 인스턴스를 시작합니다. 따라서 두 경우 모두 타이밍에 따른 스크립트를 쉽게 실행할 수 있는 방법이 없습니다(즉, 하나의 구성 파일이 다른 구성 파일에 필요한 작업을 수행하거나 다른 구성 파일에 어떤 식으로든 영향을 미치는 경우). 또는 각 소스 이후의 출력을 저장하면 time누적 타이밍을 얻을 수 있습니다.

TIMEFMT=%E
{time} 2> times
for file in  ${(M)config_files}
do
    source file
    {time} 2>> times
done

awk그런 다음 또는 뭔가를 사용하여 개별 타이밍을 얻을 수 있습니다.

awk 'NR != 1 {print $0 - prev} {prev = $0; getline}' times

답변2

명령 을 보고 man time메모했습니다.

Users of the bash shell need to use an explicit path in order to run
the external time command and not the shell builtin variant.  On system
where time is installed in /usr/bin, the first example would become

그래서 시간에 대한 경로를 제공해야 한다고 생각합니다. 저는 zsh에 대한 경험이 없습니다.

관련 정보