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

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

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

내가 하고 싶은 일은:

  • 명령을 사용하여 time여러 명령을 동시에 실행하는 데 소요된 시간 측정
  • 쓰다오직time파일로 출력
  • stderr내가 측정하고 있는 모든 명령을 적어보세요 stderr.아니요파일로

내가 하는 일아니요내가 하고 싶은 일은:

  • 여러 명령을 별도의 스크립트에 작성
    • 왜? 이 모든 것은 이미 내가 프로그래밍 방식으로 생성하고 만든 스크립트이기 때문입니다.다른임시 스크립트는 내가 원하는 것보다 더 혼란스럽습니다.

내가 지금까지 시도한 것 :

  1. /usr/bin/time --output=outtime -p echo "a"; echo "b";
    • 작동하지 않고 time첫 번째 항목에서만 실행됩니다.
  2. /usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
    • 작동하지 않습니다. (예상치 못한 토큰입니다.
  3. /usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
    • 작동하지 않습니다. "해당 파일이나 디렉터리가 없습니다."
  4. /usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
    • 작동하지 않습니다. "해당 파일이나 디렉터리가 없습니다."
  5. time ( echo "a"; echo "b"; ) 2>outtime
    • STDERR모든 것을 로 리디렉션하기 때문에 작동하지 않습니다 outtime. 나는 time거기에서 출력을 원합니다.
  6. 그리고 물론,time --output=outime echo "a";
    • 때문에 작동하지 않습니다 --output=outime: command not found.

어떻게 해야 합니까?

답변1

sh -c 'commands'예를 들어 다음과 같은 명령으로 사용됩니다.

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

답변2

정답은 아니지만 질문과 매우 관련이 있습니다.
여러 프로그램에 대한 타이밍 통계를 얻으려면 괄호를 결합해야 합니다. 세미콜론으로 명령을 구분하세요.;또는&&, command2만 실행해야 하는 경우 command1이 오류 없이 종료되는 경우:

time ( command1 ; command2 )

time ( command1 && command2 )

답변3

이 시도:

% (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.timetime

% (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에 작성된 모든 내용이 파일로 이동됩니다. 남은 것은 측정 명령의 표준 오류를 fd 3으로 리디렉션하는 것입니다.

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

이제 여러 명령에 대한 시간을 측정하려면 (또 다른!) 서브셸(괄호 안)에서 명령을 실행해야 합니다. 모든 오류 출력을 fd 3으로 리디렉션하려면 중괄호 안에 그룹화해야 합니다.

결국 우리는 다음을 얻습니다.

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

그게 다야.

답변4

Bash에서 이것은 나에게 완벽하게 작동하며 콘솔에는 아무것도 인쇄되지 않습니다.

> time ( echo "a"; echo "b") 1>/dev/null 2>output_time_file

> cat output_time_file

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

관련 정보