여러 명령에서 시간을 실행하고 시간 출력을 파일에 쓰는 방법은 무엇입니까?


66

time여러 명령의 시간을 측정 하기 위해 명령 을 실행하고 싶습니다 .

내가하고 싶은 것은 :

  • 함께 추가 된 모든 시간을 측정하십시오.
  • 쓰기 time파일로 출력
  • 쓰기 STDERRI가 측정하고 명령에서STDERR

내가 뭘 하지 하고 싶은 것은

  • 여러 명령을 별도의 스크립트에 작성하십시오 (이유는 모두 프로그래밍 방식으로 생성하는 스크립트이므로 다른 임시 스크립트를 작성하는 것이 원하는 것보다 엉망입니다)

내가 지금까지 시도한 것 :

/usr/bin/time --output=outtime -p echo "a"; echo "b";

작동하지 않으며 time첫 번째에서만 실행됩니다.

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

작동하지 않습니다 (. 예기치 않은 토큰입니다.

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

"이러한 파일이나 디렉토리가 없습니다"작동하지 않습니다.

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

"이러한 파일이나 디렉토리가 없습니다"작동하지 않습니다.

time ( echo "a"; echo "b"; ) 2>outtime

그것은 모두 STDERR로 리디렉션되기 때문에 작동하지 않습니다 outtime. time거기 에 출력 만 원합니다 .

그리고 물론

time --output=outime echo "a";

이후로 작동하지 않습니다 --output=outime: command not found.

내가 어떻게 해?

답변:


90

sh -c 'commands'명령으로 사용하십시오 . 예 :

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'

2
더 짧은 버전 :time -p sh -c 'echo "a"; echo "b"'
Geo

8

이 시도:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

설명:

먼저의 출력을 리디렉션하는 방법을 찾아야합니다 time. 이후 time쉘 내장이며,이 명령을 리디렉션 포함한 측정하기 위해 전체 명령 라인 걸린다. 그러므로,

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[참고 : janos의 의견은 이것이 사실이 아님을 암시합니다 bash.] 서브 쉘에서 time실행 time한 다음 해당 서브 쉘의 출력을 리디렉션하여 의 출력 리디렉션을 얻을 수 있습니다 .

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

이제의 출력을 성공적으로 재 지정 time했지만 출력은 측정중인 명령의 오류 출력과 혼합됩니다. 둘을 분리하기 위해 추가 파일 설명자를 사용합니다.

"외부"에는

% (time ... ) 3>&2 2>timeout

즉, 파일 설명자 3에 기록 된 내용이 파일 설명자 2 (표준 오류)가 출력되는 동일한 위치 (터미널)로 출력됩니다. 그런 다음 표준 오류를 파일로 리디렉션합니다 timeout.

이제 우리는 stdout과 fd 3에 쓰여진 모든 것이 터미널로 가고 stderr에 쓰여진 모든 것이 파일로 갈 것입니다. 남은 것은 측정 된 명령의 stderr를 fd 3으로 리디렉션하는 것입니다.

% (time whatever 2>&3) 3>&2 2>timeout

이제 시간을 둘 이상의 명령을 측정하려면 (other!) 서브 쉘 (괄호 안에)로 실행해야합니다. 그리고 이들 모두의 오류 출력을 fd 3으로 리디렉션하려면 중괄호 안에 그룹화해야합니다.

마지막으로 다음에 도달합니다.

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

그게 다야.


POSIX 셸의 구문 오류입니다. 아마 배쉬 즘?
josch

@josch 여기에 사용 된 쉘은 zsh입니다.
angus

6

정답은 아니지만 질문과 관련이 있습니다.
여러 프로그램에 대한 타이밍 통계를 얻으려면 괄호가 필요합니다. 세미콜론으로 명령을 구분하십시오.

time ( command1 ; command2 )

1
이거 좋은데. 더 좋은 방법은 명령 사이에 &&를 사용 time ( command1 && command2 )하는 것입니다. 다른 것을 실행하지 않습니다.
bikashg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.