time
하나의 파이프 출력이 다른 두 개의 명령으로 구성된 명령을 원합니다 . 예를 들어 아래 두 스크립트를 고려하십시오.
$ cat foo.sh
#!/bin/sh
sleep 4
$ cat bar.sh
#!/bin/sh
sleep 2
이제 time
걸리는 시간을 어떻게 보고 할 수 foo.sh | bar.sh
있습니까? (그렇습니다. 파이프가 의미가 없다는 것을 알고 있지만 이것은 단지 예일뿐입니다) 파이프없이 서브 쉘에서 순차적으로 실행하면 예상대로 작동합니다.
$ time ( foo.sh; bar.sh )
real 0m6.020s
user 0m0.010s
sys 0m0.003s
그러나 배관 할 때 작동하지 않습니다.
$ time ( foo.sh | bar.sh )
real 0m4.009s
user 0m0.007s
sys 0m0.003s
$ time ( { foo.sh | bar.sh; } )
real 0m4.008s
user 0m0.007s
sys 0m0.000s
$ time sh -c "foo.sh | bar.sh "
real 0m4.006s
user 0m0.000s
sys 0m0.000s
비슷한 질문 ( 여러 명령에서 시간을 실행하고 시간 출력을 파일에 쓰는 방법? )을 읽고 독립 time
실행 파일을 사용해 보았습니다 .
$ /usr/bin/time -p sh -c "foo.sh | bar.sh"
real 4.01
user 0.00
sys 0.00
파이프 만 실행하는 세 번째 스크립트를 만들면 작동하지 않습니다.
$ cat baz.sh
#!/bin/sh
foo.sh | bar.sh
그리고 그 시간 :
$ time baz.sh
real 0m4.009s
user 0m0.003s
sys 0m0.000s
흥미롭게도 time
첫 번째 명령이 완료되는 즉시 종료되는 것처럼 보이지 않습니다 . 내가 변경 bar.sh
하면 :
#!/bin/sh
sleep 2
seq 1 5
그리고 time
다시, 나는 time
전에 출력이 인쇄되기를 기대 seq
했지만 그렇지 않았습니다.
$ time ( { foo.sh | bar.sh; } )
1
2
3
4
5
real 0m4.005s
user 0m0.003s
sys 0m0.000s
보고서를 인쇄하기 전에 완료 될 때까지 기다리더라도 time
실행하는 데 걸린 시간을 계산하지 않는 것 같습니다 1 .bar.sh
모든 테스트는 아치 시스템에서 bash 4.4.12 (1) 릴리스를 사용하여 실행되었습니다. 프로젝트에 bash 만 사용할 수 있습니다. 이것은 zsh
일부 또는 다른 강력한 쉘이 그 주위를 돌아 다닐 수있는 경우에도 가능한 해결책이 아닙니다.
그렇다면 파이프 명령 세트를 실행하는 데 걸리는 시간을 어떻게 알 수 있습니까? 그리고 우리가있는 동안 왜 작동하지 않습니까? time
첫 번째 명령이 완료 되 자마자 즉시 종료되는 것처럼 보입니다 . 왜?
나는 이런 식으로 개별 시간을 얻을 수 있다는 것을 안다.
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
그러나 여전히 모든 작업을 단일 작업으로 시간을 정할 수 있는지 알고 싶습니다.
(1) 이 버퍼 문제가 될 것 같지 않습니다, 내가 가진 스크립트를 실행하려고 unbuffered
하고 stdbuf -i0 -o0 -e0
와 숫자는 여전히 전에 인쇄 된 time
출력.