`time` 출력과 명령 출력을 같은 파이프로 어떻게 리디렉션 할 수 있습니까?


24

이진이 있다고 가정합니다 foo.

출력을 foo다른 프로세스 로 리디렉션하려면 bar쓸 수 ./foo | bar있습니다.

반면에, timefoo를 원 하고 출력을 리디렉션하려면을 time쓸 수 time (./foo) | bar있습니다.

내 질문은 출력의 time끝에 출력을 foo붙이고 동일한 파이프를 통해 파이프 할 수 있습니까?

다음 솔루션은 프로세스의 두 개의 개별 인스턴스를 시작 하지만 단일 공유 파이프를 원하지만의 단일 인스턴스를 원 하기 때문에 내가 찾고있는 것이 아닙니다 .barbar

time (./foo | bar)  | bar

궁금한 사람에게는 두 개의 인스턴스를 시작하지 않으려는 이유 는 네트워크 클라이언트 일 수 bar있기 때문에 프로세스 출력 bar과 동일한 http POST메시지의 일부로 타이밍 정보를 서버에 전송하기를 원하기 때문 입니다.


여기에 대답, 약간 더 나은 답변 : stackoverflow.com/questions/13356628/…
JDS

답변:


29

당신이 무엇을 요구하는지 이해한다면 나는 이것을 할 것입니다. 나는 명령을 사용하고 있습니다 ls ~tee대한 독립 인으로 ./foo하고 bar있지만, 무엇 당신이 원하는의 일반적인 형태를 :

$ ( time ./foo ) |& bar

참고 : 의 출력은의 출력 time끝에 이미 첨부 ./foo되어 있으며 STDERR에서 수행 중입니다. 파이프를 통해 경로를 재 지정하려면 STDERR을 STDOUT과 결합해야합니다. |&또는 2>&1을 사용 하여 수행 할 수 있습니다.

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

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

그리고 여기에 cmd.log의해 만들어진 파일의 내용이 tee있습니다.

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

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

이 구문은 BASH에서는 작동하지 않습니다.
jvriesem

1
@jvriesem 모든 예제는 bash
slm에서 온 것입니다.

9

time기본적으로 출력을 stdout 대신 stderr로 보냅니다. 원하는 위치로 리디렉션하면됩니다.

당신이 말하는 "내가 원한다면, 다른 한편으로 timefoo는, 그리고 출력 리디렉션 time내가 쓸 수 있습니다 time (./foo) | bar." 그러나 이것은 실제로 잘못되었습니다. 이 경우 시간 출력은 여전히 ​​콘솔에 표시되며 stdout 만 리디렉션됩니다.

stderr을 다음과 같이 구체적으로 리디렉션 할 수 있습니다.

(time foo) 2>&1 | bar

또는 모든 파이프 :

(time foo) |& bar

이것이 제대로 작동하려면 괄호가 필요합니다.


0

이것이 Solaris에서 작동한다는 것을 알았습니다. (time ls) &> file


1
이것은 기존 솔루션과 다르지 않습니다
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.