Linux에서 time 명령의 출력을 파일로 리디렉션하는 방법은 무엇입니까?


202

Linux에서 프로그램 타이밍에 관한 약간의 질문 : time 명령을 사용하면 프로그램의 실행 시간을 측정 할 수 있습니다.

[ed@lbox200 ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

어느 것이 잘 작동합니까? 그러나 출력을 파일로 리디렉션하려고하면 실패합니다.

[ed@lbox200 ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[ed@lbox200 ~]$ cat time.txt 
[ed@lbox200 ~]$ 

파일을 작성하는 옵션 -o를 사용하여 다른 시간 구현이 있다는 것을 알고 있지만 내 질문은 해당 옵션이없는 명령에 관한 것입니다.

어떤 제안?


3
bash 스크립트 쓰기 실행 시간이 파일에서 중복 될 수 있으며 이것이 첫 번째 질문이라는 것을 확신하지 못합니다.
Jonathan Leffler

답변:


266

시험

{ time sleep 1 ; } 2> time.txt

"시간"의 STDERR과 명령을 time.txt로 결합한

또는 사용

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

"sleep"의 STDERR을 "sleep.stderr"파일에 넣고 "time"의 STDERR 만 "time.txt"로갑니다.


2
고마워, 내 질문에 정확하게 답해. 올바르게 이해하면 시간 명령의 결과를 stderr에서 얻을 수 있습니까?
ed82

7
예, 그러나 중괄호로 묶어야합니다. 그렇지 않으면 리디렉션이 time평가 되는 명령의 일부가 됩니다.

5
@Daniel 당신은 항상 내부 명령 출력을 따로 따로 리다이렉션 할 수 있고 (즉, {time sleep 1 2> sleepStdErr.txt;} 2> time.txt) 시간 출력 만 얻을 수 있습니다. 그렇지 않으면 독립적으로 얻을 수있는 방법이 있는지 확실하지 않습니다.
gms7777

10
stdout을 읽는 grep과 같은 시간을 사용하려면 시도하십시오 { time sleep 1; } 2>&1 | grep real. 그러면 stderr을 stdout으로 보내어 grep을 읽을 수 있습니다.
clayzermk1

9
';'을 잊지 마십시오 '}'닫기 전에 문자, 그것은 것입니다 (내가 한, 그리고 ... 궁금 왜 작동하지 않습니다 :))없이 NOT 일
THESorcerer

38

time과 타이밍 명령은 대괄호로 묶습니다.

예를 들어, 다음은 시간 ls결과 ls와 타이밍 결과를 다음에 기록합니다 outfile.

$ (time ls) > outfile 2>&1

또는 명령의 출력을 캡처 된 출력과 time다음 에서 분리하려는 경우 :

$ (time ls) > ls_results 2> time_results

12
여기에 서브 쉘을 소개 할 필요는 없습니다.

1
@ sampson-chen ls가 stderr에 아무것도 쓰지 않기 때문에 작동합니까? 명령이 stdout과 stderr에 모두 쓰는 경우 실행할 'time'의 출력을 명령의 출력과 어떻게 "분리"합니까?
David Doria

36

단순한. GNU time유틸리티에는 옵션이 있습니다.

그러나 당신은 당신이 있는지 확인해야 하지 쉘의 내장을 사용하여 time, 명령을 적어도 bash내장 해당 옵션을 제공하지 않습니다! 따라서 time유틸리티 의 전체 경로를 제공해야 합니다.

/usr/bin/time -o time.txt sleep 1

: 당신은 또한 전체 경로를 지정하지 않고 비 내장을 사용할 수 있습니다 stackoverflow.com/questions/29540540/...
치로 틸리郝海东冠状病六四事件法轮功

14

명령의 오류 출력에 신경 쓰면 내장 시간 명령을 계속 사용하면서 이와 같이 분리 할 수 ​​있습니다.

{ time your_command 2> command.err ; } 2> time.log

또는

{ time your_command 2>1 ; } 2> time.log

보시다시피 명령의 오류는 파일로 이동합니다 (때문에 stderr사용됩니다 time).

불행히도 3>&2더 이상 다른 핸들 (예 :)로 보낼 수 없습니다 .{...}

GNU 시간을 사용할 수 있다면 @Tim Ludwinski가 말한 것을 수행하십시오.

\time -o time.log command

8

'time'명령의 출력은 오류 출력이므로 표준 처리가 더 직관적으로 처리되므로 추가 처리를 수행하도록 리디렉션하십시오.

{ time sleep 1; } 2>&1 |  cat > time.txt

6

bash 내장 대신 GNU 시간을 사용하는 경우

time -o outfile command

(참고 : GNU 시간 형식은 bash 내장과 약간 다릅니다.)


1
감사합니다 그리고 \time -o outfile command내장 된 대신 GNU를 사용 하기 위해 (``와 함께) 사용할 수 있습니다 .
Mark

3
&>out time command >/dev/null

당신의 경우에

&>out time sleep 1 >/dev/null

그때

cat out

3
우아한 아이디어이지만 쉘이 내장 명령을 사용하지 않습니다. 실제 time바이너리가 설치되어 있지 않으면 out다음과 같은 내용이 포함됩니다 bash: time: command not found.
scy

또한 GNU 시간의 형식은 bash 내장과 동일하지 않으므로 자동 구문 분석에 문제가 발생합니다.
Guss

3

나는 다음을 사용하여 끝났다.

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • "a"가 추가 된 곳
  • 추가 할 파일 이름으로 "o"가 진행되는 위치
  • 여기서 "f"는 printf와 같은 구문으로 형식화됩니다.
  • "% E"는 0:00:00을 생성합니다. 시간 : 분 : 초
  • bash "time"이 그것을 짓밟고 있고 동일한 옵션이 없기 때문에 / usr / bin / time을 호출해야했습니다.
  • 방금 OP와 같은 것이 아니라 파일로 출력하려고했습니다.

2
#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "$@" 2>&3
}

_time_1() {
    time _time_2 "$@"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "$@" 2>"$TMPD/timing.$time_label"
    echo "time[$time_label]"
    cat "$TMPD/timing.$time_label"
}

_time a _do_something
_time b _do_another_thing
_time c _finish_up

이것은 하위 쉘을 생성하지 않는 이점이 있으며, 최종 파이프 라인에는 실제 stderr로 stderr이 복원되었습니다.


0

원래 프로세스의 stdout 및 stderr을 건드리지 않으려면 stderr을 파일 설명자 3으로 리디렉션하고 다시 되돌릴 수 있습니다.

$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out

real    0m0.009s
user    0m0.004s
sys     0m0.000s

랩퍼 (예 : cronjobs)에이를 사용하여 런타임을 모니터 할 수 있습니다.

#!/bin/bash

echo "[$(date)]" "$@" >> /my/runtime.log

{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log

0

사용중인 경우 다음을 사용할 csh수 있습니다.

/usr/bin/time --output=outfile -p $SHELL  -c 'your command'

예를 들면 다음과 같습니다.

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.