zsh 스크립트를 zsh 쉘 함수로 변환

zsh 스크립트를 zsh 쉘 함수로 변환

나는 사용하고있다zsh에서 자신만의 쉘 함수를 정의하고 로드하는 방법내 zsh 스크립트를 쉘 함수로 변환합니다.

이것스크립트내가 변환하려는 것은 다음과 같습니다.

#! /bin/zsh -

trap true INT QUIT

zmodload zsh/datetime
TIMEFMT='Total duration: %*E'
strftime -s start 'Start Time: %d/%m/%y %I:%M%P'
{
  duration=$(
    exec 4>&2 2>&1 1>&3 3>&-
    time "$@" 2>&4 4>&-
  )
} 3>&1
ret=$?
strftime -s end 'End Time: %d/%m/%y %I:%M%P'
echo -e
print -rlu2 $start $end $duration
return $ret

그래서 나는 shebang을 제거하고 스크립트를 내 fpath.

문제는 더 이상 표시되지 않는다는 것입니다 $duration.

% reporttime tail -f ~/.xsession-errors
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
Cinnamon warning: Log level 128: posix_spawn avoided (fd close requested)
^C
Start Time: 03/01/21 03:15pm
End Time: 03/01/21 03:15pm

어떡해?

답변1

문제를 재현할 수 없습니다. 그러나 자동 로드 가능한 함수로 만들려면 트랩과 변수를 함수에 로컬로 만들어야 합니다. 의 출력은 echo -e보고서의 나머지 부분과 마찬가지로 stderr로 전송되거나 호출에 줄 바꿈을 추가해야 합니다 print.

zmodload zsh/datetime

set -o localtraps
trap true INT QUIT

local TIMEFMT='Total duration: %*E' start end ret duration

strftime -s start 'Start Time: %d/%m/%y %I:%M%P'

{
  duration=$(
    exec 4>&2 2>&1 1>&3 3>&-
    time "$@" 2>&4 4>&-
  )
} 3>&1
ret=$?

strftime -s end 'End Time: %d/%m/%y %I:%M%P'
print -rlu2 '' $start $end $duration
return $ret

또 다른 옵션은 전체를 래핑하여 (...)하위 쉘에서 실행하는 것입니다.

언급한 답변에서 이미 언급한 바와 같이 프로세스에서 소비한 리소스를 보고하므로(경과 시간 및 CPU 시간에 국한되지 않고 zsh메모리 사용량, 컨텍스트 전환, I/O 작업도 포함될 수 있음) , 하위 프로세스에서 실행되는 명령에만 사용할 수 있습니다. 따라서 함수를 사용하려면 해당 함수가 서브쉘 프로세스에서 실행되도록 with로 바꿔야 합니다 .timezshtimetime "$@"time ("$@")

하지만 당신은 오직 관심에만 관심이 있기 때문에과거실제로 리소스를 처리하는 대신 제가 제안한 다른 접근 방식을 사용하여 종료 시간을 수동으로 계산할 수도 있습니다( 원하는 경우 HH:MM:SS.TTT수동으로 형식을 지정하거나 사용할 수도 있습니다 ).strftime

관련 정보