명령 실행 시간을 기록하고 싶습니다. 이 같은:
#!/usr/bin/env bash
echo "$@" >> /tmp/times
exec 3>&2
(/usr/bin/time -f "%e" "$@" 2>&3) 2>>/tmp/times
문제는 시간이 지나면 표준 오류를 오염시키는 하위 프로세스가 생성된다는 것입니다. 부작용 없이 할 수 있나요?
답변1
를 사용하는 경우 /usr/bin/time
시간이 지정된 프로세스의 표준 오류 및 시간 정보를 다른 채널로 보내는 유일한 방법은 time
유틸리티에 그렇게 하도록 지시하는 것입니다. time
타이머 프로세스의 stderr 및 자체 출력이 time
동일한 파일 설명자로 전송되기 때문에 리디렉션을 사용하여 호출 셸에서 이를 수행할 수 없습니다 .
사용 중인 유틸리티 time
(사용법에 따라 GNU coreutils) 에는 다른 파일에 쓰고 해당 파일에 추가하도록 지시하는 -f
옵션이 있습니다 . 이 옵션은 FreeBSD 및 macOS에도 있습니다.-o
-a
#!/bin/sh
echo "$@" >>/tmp/times
exec time -f %e -a -o /tmp/times -- "$@"
또는 shell 키워드를 사용할 수 있습니다(bash, ksh 및 zsh를 포함하여 이 키워드가 있는 쉘에서). 키워드를 사용하면 시간 지정 프로세스의 일부로 리디렉션을 지정할 수 있으므로 시간 정보가 리디렉션되는 위치를 제어할 수 있습니다.
#!/bin/bash
echo "$@" >>/tmp/times
TIMEFORMAT='%R'
{ time "$@" 2>&3; } 3>&2 2>>/tmp/times