'grep'은 'time'과 함께 작동하지 않습니까?

'grep'은 'time'과 함께 작동하지 않습니까?

time ls | grep real이것을 출력 합니까?

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

그냥 대신에

real    0m0.002s

내가 입력하면

echo -e 'real\t0m0.002s\nuser\t0m0.000s\nsys\t0m0.002s\n' | grep real

나는 내가 기대하는 것을 얻습니다. 즉,

real    0m0.002s

나는 이것이 효과가 있다는 것을 알았습니다.

(time ls)  2>&1 > /dev/null | grep real

이 명령은 무엇을 합니까?

답변1

time ls | grep real예상대로 작동 하지 않는 이유는 무엇입니까 ?

timebash예약어이며 와 다르게 동작합니다 /usr/bin/time.

시간 예약어가 파이프라인 앞에 오면 해당 실행에 소비된 사용자 및 시스템 시간과 경과된 시간이 보고됩니다.파이프라인이 종료될 때.

원천bash(1): GNU Bourne-Again SHell - Linux 매뉴얼 페이지

또한 time표준 출력이 아닌 표준 오류로 출력됩니다.

다음 명령을 사용하십시오.

(time ls) 2>&1 >/dev/null | grep real 

노트:

  • and는 (및 명령 을 함께 )그룹화합니다 (따라서 이러한 명령이 먼저 평가됩니다).timels

  • 2>&1 >/dev/null먼저 stderr를 stdout(파이프)으로 리디렉션한 다음 stdout을 /dev/null.

    그래서 stderr은 파이프로 가고 stdout은 아무데도 가지 않습니다.


추가 자료

답변2

예, 작동하지만 약간의 I/O 리디렉션이 필요합니다. :)

$ exec 3>&1 4>&2
{ time sleep 1 1>&3 2>&4; } 2>&1 |
    grep 'real'    
exec 3>&- 4>&-

출력 :

real    0m1,003s

읽다배쉬 FAQ#32그리고I/O 리디렉션 튜토리얼


아주 간단한 방법은 다음과 같습니다.

$ TIMEFORMAT=%R
$ time sleep 1
1,003

답변3

여기에는 두 가지 문제가 있습니다.

첫 번째이자 가장 중요한 것은 "시간"이 출력을 stdout이 아닌 stderr(표준 오류)로 보내므로 특별한 조치를 취하지 않는 한 일반적인 리디렉션 명령으로 캡처되지 않습니다.

둘째, time은 일반 프로그램이 아니라 쉘(bash, csh, tcsh 등과 같은 쉘의 경우)에서 직접 해석되는 특수 내장 명령입니다. 따라서 이는 비표준 방식으로 작동하며 (매우 특이한 쉘을 사용하지 않는 한) 전체 명령줄의 시간을 측정합니다.

따라서 (bash를 사용하여) 원하는 결과를 얻으려면 다음을 사용해야 합니다.

(time ls) 2>&1 | grep real

이것은 서브쉘에서 "ls"를 실행하고 시간을 측정합니다.(시간 ls)] , 표준 오류를 표준 출력으로 보냅니다.[ 2>&1 ], 그런 다음 표준을 "grep" [|그렙].

">?dev/null"을 사용한 마지막 부분은 "real"이라는 단어가 포함된 경우 ls 명령 자체의 일반 출력을 버립니다.

답변4

time가 아닌 콘솔에 직접 쓰는 것으로 보입니다 stdout. 이는 명령이나 파이프라인의 출력이 를 추가해도 영향을 받지 않는다는 것을 의미합니다 time.

따라서 전체 파이프라인의 시간이 정해지기 때문에 grep어떤 경우에도 완료 후에 생성되는 시간 보고서를 볼 수 없습니다 .grep

관련 정보