![여러 명령에서 시간을 실행하고 시간 출력을 파일에 쓰는 방법은 무엇입니까?](https://linux55.com/image/24849/%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%20%EC%8B%9C%EA%B0%84%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EA%B3%A0%20%EC%8B%9C%EA%B0%84%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EC%93%B0%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
time
여러 명령의 시간을 측정하기 위해 명령을 실행하고 싶습니다 .
내가 하고 싶은 일은:
- 명령을 사용하여
time
여러 명령을 동시에 실행하는 데 소요된 시간 측정 - 쓰다오직
time
파일로 출력 stderr
내가 측정하고 있는 모든 명령을 적어보세요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
.
- 때문에 작동하지 않습니다
어떻게 해야 합니까?
답변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
.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에 작성된 모든 내용이 파일로 이동됩니다. 남은 것은 측정 명령의 표준 오류를 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